diff --git a/build.gradle b/build.gradle index d530bcf2..31a171df 100644 --- a/build.gradle +++ b/build.gradle @@ -62,8 +62,8 @@ dependencies { implementation 'io.zipkin.reporter2:zipkin-sender-okhttp3:2.10.0' implementation 'ch.qos.logback:logback-classic:1.3.14' implementation 'org.slf4j:log4j-over-slf4j:1.7.32' - implementation 'com.glencoesoftware.omero:omero-zarr-pixel-buffer:0.3.0' - implementation 'com.glencoesoftware.omero:omero-ms-core:0.8.0' + implementation 'com.glencoesoftware.omero:omero-zarr-pixel-buffer:0.4.0-SNAPSHOT' + implementation 'com.glencoesoftware.omero:omero-ms-core:0.9.0-SNAPSHOT' implementation 'io.vertx:vertx-web:3.8.1' implementation 'io.vertx:vertx-config:3.8.1' implementation 'io.vertx:vertx-config-yaml:3.8.1' diff --git a/src/dist/conf/config.yaml b/src/dist/conf/config.yaml index 3af6ef57..720779a9 100644 --- a/src/dist/conf/config.yaml +++ b/src/dist/conf/config.yaml @@ -31,6 +31,7 @@ omero.server: # The following should be set to match your OMERO.web settings # See https://docs.openmicroscopy.org/omero/5.6.3/sysadmins/config.html#omero-client-viewer-interpolate-pixels # and https://docs.openmicroscopy.org/omero/5.6.3/sysadmins/config.html#omero-client-viewer-initial-zoom-level + omero.pixeldata.pixels_service: "ZarrPixelsService" omero.pixeldata.zarr_cache_size: "500" omero.client.viewer.initial_zoom_level: "0" omero.client.viewer.interpolate_pixels: "true" diff --git a/src/main/java/com/glencoesoftware/omero/ms/image/region/HistogramRequestHandler.java b/src/main/java/com/glencoesoftware/omero/ms/image/region/HistogramRequestHandler.java index a6a2a9c4..ea47272c 100644 --- a/src/main/java/com/glencoesoftware/omero/ms/image/region/HistogramRequestHandler.java +++ b/src/main/java/com/glencoesoftware/omero/ms/image/region/HistogramRequestHandler.java @@ -18,6 +18,8 @@ package com.glencoesoftware.omero.ms.image.region; +import com.glencoesoftware.omero.zarr.ZarrPixelsService; + import java.util.Arrays; import java.util.HashMap; import java.util.List; @@ -59,7 +61,7 @@ public class HistogramRequestHandler { HistogramCtx histogramCtx; /** OMERO server pixels service. */ - private PixelsService pixelsService; + private ZarrPixelsService pixelsService; /** * Constructor. Populates histogramCtx and pixelsService @@ -67,7 +69,7 @@ public class HistogramRequestHandler { * @param pixelsService */ public HistogramRequestHandler(HistogramCtx histogramCtx, - PixelsService pixelsService) { + ZarrPixelsService pixelsService) { this.histogramCtx = histogramCtx; this.pixelsService = pixelsService; } diff --git a/src/main/java/com/glencoesoftware/omero/ms/image/region/ImageDataRequestHandler.java b/src/main/java/com/glencoesoftware/omero/ms/image/region/ImageDataRequestHandler.java index 72d916dd..51c8d58c 100644 --- a/src/main/java/com/glencoesoftware/omero/ms/image/region/ImageDataRequestHandler.java +++ b/src/main/java/com/glencoesoftware/omero/ms/image/region/ImageDataRequestHandler.java @@ -18,6 +18,8 @@ package com.glencoesoftware.omero.ms.image.region; +import com.glencoesoftware.omero.zarr.ZarrPixelsService; + import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -76,7 +78,7 @@ public class ImageDataRequestHandler { private ImageDataCtx imageDataCtx; /** OMERO server pixels service. */ - private PixelsService pixelsService; + private ZarrPixelsService pixelsService; /** Initial Zoom level from server settings **/ private int initZoom; @@ -92,7 +94,7 @@ public class ImageDataRequestHandler { * @param interpolate Interpolation server setting */ public ImageDataRequestHandler(ImageDataCtx imageDataCtx, - PixelsService pixelsService, + ZarrPixelsService pixelsService, int initZoom, boolean interpolate) { this.imageDataCtx = imageDataCtx; this.pixelsService = pixelsService; diff --git a/src/main/java/com/glencoesoftware/omero/ms/image/region/ImageRegionMicroserviceVerticle.java b/src/main/java/com/glencoesoftware/omero/ms/image/region/ImageRegionMicroserviceVerticle.java index 31ec94e3..2953ab40 100644 --- a/src/main/java/com/glencoesoftware/omero/ms/image/region/ImageRegionMicroserviceVerticle.java +++ b/src/main/java/com/glencoesoftware/omero/ms/image/region/ImageRegionMicroserviceVerticle.java @@ -171,6 +171,7 @@ public void deploy(JsonObject config, Promise prom) { context = new ClassPathXmlApplicationContext( "classpath:ome/config.xml", "classpath:ome/services/datalayer.xml", + "classpath*:blitz/*PixelBuffer.xml", "classpath*:beanRefContext.xml"); preferences = (PreferenceContext) this.context.getBean("preferenceContext"); diff --git a/src/main/java/com/glencoesoftware/omero/ms/image/region/ImageRegionRequestHandler.java b/src/main/java/com/glencoesoftware/omero/ms/image/region/ImageRegionRequestHandler.java index 3f86b9d5..2b72fd3a 100644 --- a/src/main/java/com/glencoesoftware/omero/ms/image/region/ImageRegionRequestHandler.java +++ b/src/main/java/com/glencoesoftware/omero/ms/image/region/ImageRegionRequestHandler.java @@ -18,6 +18,8 @@ package com.glencoesoftware.omero.ms.image.region; +import com.glencoesoftware.omero.zarr.ZarrPixelsService; + import java.awt.Dimension; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; @@ -90,7 +92,7 @@ public class ImageRegionRequestHandler { protected final List renderingModels; /** OMERO server pixels service. */ - protected final PixelsService pixelsService; + protected final ZarrPixelsService pixelsService; /** Reference to the projection service. */ private final ProjectionService projectionService; @@ -112,7 +114,7 @@ public ImageRegionRequestHandler( LutProvider lutProvider, LocalCompress compressionSrv, int maxTileLength, - PixelsService pixelsService) { + ZarrPixelsService pixelsService) { this.compressionSrv = compressionSrv; this.lutProvider = lutProvider; this.families = families; diff --git a/src/main/java/com/glencoesoftware/omero/ms/image/region/ImageRegionVerticle.java b/src/main/java/com/glencoesoftware/omero/ms/image/region/ImageRegionVerticle.java index c716f4f8..6c6b40ca 100644 --- a/src/main/java/com/glencoesoftware/omero/ms/image/region/ImageRegionVerticle.java +++ b/src/main/java/com/glencoesoftware/omero/ms/image/region/ImageRegionVerticle.java @@ -31,6 +31,7 @@ import com.glencoesoftware.omero.ms.core.OmeroMsAbstractVerticle; import com.glencoesoftware.omero.ms.core.OmeroRequest; import com.glencoesoftware.omero.ms.core.RedisCacheVerticle; +import com.glencoesoftware.omero.zarr.ZarrPixelsService; import Glacier2.CannotCreateSessionException; import Glacier2.PermissionDeniedException; @@ -92,7 +93,7 @@ public class ImageRegionVerticle extends OmeroMsAbstractVerticle { /** Configured maximum size size in either dimension */ private final int maxTileLength; - private final PixelsService pixelsService; + private final ZarrPixelsService pixelsService; /** Scaling service for thumbnails */ private final IScale iScale; @@ -104,7 +105,7 @@ public ImageRegionVerticle( LocalCompress compressionService, LutProvider lutProvider, int maxTileLength, - PixelsService pixelsService, + ZarrPixelsService pixelsService, IScale iScale) { this.compressionService = compressionService; diff --git a/src/main/java/com/glencoesoftware/omero/ms/image/region/PixelsService.java b/src/main/java/com/glencoesoftware/omero/ms/image/region/PixelsService.java deleted file mode 100644 index 6b42dd9d..00000000 --- a/src/main/java/com/glencoesoftware/omero/ms/image/region/PixelsService.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2021 Glencoe Software, Inc. 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 com.glencoesoftware.omero.ms.image.region; - -import java.io.File; - -import ome.api.IQuery; -import ome.io.nio.BackOff; -import ome.io.nio.FilePathResolver; -import ome.io.nio.TileSizes; -import ome.model.core.Pixels; - - -/** - * Subclass which overrides series retrieval to avoid the need for - * an injected {@link IQuery}. - * @author Chris Allan - * - */ -public class PixelsService extends com.glencoesoftware.omero.ms.core.PixelsService { - - public PixelsService( - String path, boolean isReadOnlyRepo, File memoizerDirectory, - long memoizerWait, FilePathResolver resolver, BackOff backOff, - TileSizes sizes, IQuery iQuery, - long zarrCacheSize, - int maxPlaneWidth, int maxPlaneHeight) { - super( - path, isReadOnlyRepo, memoizerDirectory, memoizerWait, resolver, - backOff, sizes, iQuery, zarrCacheSize, maxPlaneWidth, maxPlaneHeight); - } - - @Override - protected int getSeries(Pixels pixels) { - return pixels.getImage().getSeries(); - } - -} \ No newline at end of file diff --git a/src/main/java/com/glencoesoftware/omero/ms/image/region/ShapeMaskRequestHandler.java b/src/main/java/com/glencoesoftware/omero/ms/image/region/ShapeMaskRequestHandler.java index 5ec45163..8e5d4d84 100644 --- a/src/main/java/com/glencoesoftware/omero/ms/image/region/ShapeMaskRequestHandler.java +++ b/src/main/java/com/glencoesoftware/omero/ms/image/region/ShapeMaskRequestHandler.java @@ -18,7 +18,8 @@ package com.glencoesoftware.omero.ms.image.region; -import com.glencoesoftware.omero.ms.core.ZarrPixelBuffer; +import com.glencoesoftware.omero.zarr.ZarrPixelBuffer; +import com.glencoesoftware.omero.zarr.ZarrPixelsService; import java.awt.Point; import java.awt.image.BufferedImage; @@ -69,7 +70,7 @@ public class ShapeMaskRequestHandler { private final ShapeMaskCtx shapeMaskCtx; /** Configured Pixels service */ - private final PixelsService pixelsService; + private final ZarrPixelsService pixelsService; /** * Default constructor. @@ -77,7 +78,7 @@ public class ShapeMaskRequestHandler { * @param pixelsService configured pixels service */ public ShapeMaskRequestHandler( - ShapeMaskCtx shapeMaskCtx, PixelsService pixelsService) { + ShapeMaskCtx shapeMaskCtx, ZarrPixelsService pixelsService) { log.info("Setting up handler"); this.shapeMaskCtx = shapeMaskCtx; this.pixelsService = pixelsService; diff --git a/src/main/java/com/glencoesoftware/omero/ms/image/region/ShapeMaskVerticle.java b/src/main/java/com/glencoesoftware/omero/ms/image/region/ShapeMaskVerticle.java index 6f8bee44..ebc05f4d 100644 --- a/src/main/java/com/glencoesoftware/omero/ms/image/region/ShapeMaskVerticle.java +++ b/src/main/java/com/glencoesoftware/omero/ms/image/region/ShapeMaskVerticle.java @@ -24,6 +24,7 @@ import com.glencoesoftware.omero.ms.core.OmeroMsAbstractVerticle; import com.glencoesoftware.omero.ms.core.OmeroRequest; import com.glencoesoftware.omero.ms.core.RedisCacheVerticle; +import com.glencoesoftware.omero.zarr.ZarrPixelsService; import Glacier2.CannotCreateSessionException; import Glacier2.PermissionDeniedException; @@ -55,12 +56,12 @@ public class ShapeMaskVerticle extends OmeroMsAbstractVerticle { private int port; /** Configured Pixels service */ - private final PixelsService pixelsService; + private final ZarrPixelsService pixelsService; /** * Default constructor. */ - public ShapeMaskVerticle(PixelsService pixelsService) + public ShapeMaskVerticle(ZarrPixelsService pixelsService) { this.pixelsService = pixelsService; } diff --git a/src/main/java/com/glencoesoftware/omero/ms/image/region/ThumbnailsRequestHandler.java b/src/main/java/com/glencoesoftware/omero/ms/image/region/ThumbnailsRequestHandler.java index 1ee1bdde..c1083917 100644 --- a/src/main/java/com/glencoesoftware/omero/ms/image/region/ThumbnailsRequestHandler.java +++ b/src/main/java/com/glencoesoftware/omero/ms/image/region/ThumbnailsRequestHandler.java @@ -18,6 +18,8 @@ package com.glencoesoftware.omero.ms.image.region; +import com.glencoesoftware.omero.zarr.ZarrPixelsService; + import java.awt.image.BufferedImage; import java.util.Arrays; import java.util.HashMap; @@ -74,7 +76,7 @@ public ThumbnailsRequestHandler( LutProvider lutProvider, LocalCompress compressionSrv, int maxTileLength, - PixelsService pixelsService, + ZarrPixelsService pixelsService, IScale iScale) { super(thumbnailCtx, families, diff --git a/src/main/resources/beanRefContext.xml b/src/main/resources/beanRefContext.xml index 35fa2a2a..7f289d7d 100644 --- a/src/main/resources/beanRefContext.xml +++ b/src/main/resources/beanRefContext.xml @@ -52,21 +52,10 @@ - - - - - - - - - - - - - - + + + + diff --git a/src/test/java/com/glencoesoftware/omero/ms/image/region/ImageDataRequestHandlerTest.java b/src/test/java/com/glencoesoftware/omero/ms/image/region/ImageDataRequestHandlerTest.java index 34d7905f..422a589a 100644 --- a/src/test/java/com/glencoesoftware/omero/ms/image/region/ImageDataRequestHandlerTest.java +++ b/src/test/java/com/glencoesoftware/omero/ms/image/region/ImageDataRequestHandlerTest.java @@ -18,7 +18,8 @@ package com.glencoesoftware.omero.ms.image.region; -import com.glencoesoftware.omero.ms.core.ZarrPixelBuffer; +import com.glencoesoftware.omero.zarr.ZarrPixelBuffer; +import com.glencoesoftware.omero.zarr.ZarrPixelsService; import java.io.File; import java.io.IOException; @@ -409,10 +410,10 @@ public void createPixelBuffer() throws IOException, ApiUsageException { output.resolve("0"), 1024, 1024, Caffeine.newBuilder() .maximumSize(0) - .buildAsync(PixelsService::getZarrMetadata), + .buildAsync(ZarrPixelsService::getZarrMetadata), Caffeine.newBuilder() .maximumSize(0) - .buildAsync(PixelsService::getZarrArray)); + .buildAsync(ZarrPixelsService::getZarrArray)); } @Before diff --git a/src/test/java/com/glencoesoftware/omero/ms/image/region/PixelsServiceTest.java b/src/test/java/com/glencoesoftware/omero/ms/image/region/PixelsServiceTest.java deleted file mode 100644 index eff75381..00000000 --- a/src/test/java/com/glencoesoftware/omero/ms/image/region/PixelsServiceTest.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (C) 2023 Glencoe Software, Inc. 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 com.glencoesoftware.omero.ms.image.region; - -import java.io.IOException; -import java.io.File; -import java.nio.file.Files; -import java.util.UUID; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - -import omero.ApiUsageException; -import omero.model.ExternalInfo; -import omero.model.ExternalInfoI; -import omero.model.IObject; -import omero.model.Image; -import omero.model.ImageI; -import omero.model.Mask; -import omero.model.MaskI; -import omero.util.IceMapper; - -import static omero.rtypes.rdouble; -import static omero.rtypes.rlong; -import static omero.rtypes.rstring; - -public class PixelsServiceTest { - - private PixelsService pixelsService; - private String uuid = UUID.randomUUID().toString(); - private String imageUri = "/data/ngff/image.zarr"; - private String labelUri = imageUri + "/0/labels/" + uuid; - private Image image; - private Mask mask; - private String ENTITY_TYPE = "com.glencoesoftware.ngff:multiscales"; - private int ENTITY_ID = 3; - - @Before - public void setUp() throws IOException { - File pixelsDir = Files.createTempDirectory("pixels").toFile(); - pixelsDir.deleteOnExit(); - File memoDir = Files.createTempDirectory("memoizer").toFile(); - memoDir.deleteOnExit(); - pixelsService = new PixelsService( - pixelsDir.getAbsolutePath(), false, memoDir, 0L, null, null, null, null, 0, 0, 0); - mask = new MaskI(); - image = new ImageI(); - } - - private void addExternalInfo(IObject object, Integer entityId, String entityType, String lsid, String uuid) { - ExternalInfo externalInfo = new ExternalInfoI(); - externalInfo.setEntityId(rlong(entityId)); - externalInfo.setEntityType(rstring(entityType)); - if (lsid != null) { - externalInfo.setLsid(rstring(lsid)); - } - if (uuid != null) { - externalInfo.setUuid(rstring(uuid)); - } - object.getDetails().setExternalInfo(externalInfo); - } - - @Test - public void testDefault() throws ApiUsageException, IOException { - addExternalInfo(mask, ENTITY_ID, ENTITY_TYPE, labelUri, uuid); - Assert.assertEquals(pixelsService.getUri((ome.model.roi.Mask) new IceMapper().reverse(mask)), labelUri); - - addExternalInfo(image, ENTITY_ID, ENTITY_TYPE, imageUri, uuid); - Assert.assertEquals(pixelsService.getUri((ome.model.core.Image) new IceMapper().reverse(image)), imageUri); - } - - @Test - public void testGetUriNoExternalInfo() throws ApiUsageException, IOException { - Assert.assertNull(pixelsService.getUri((ome.model.roi.Mask) new IceMapper().reverse(mask))); - Assert.assertNull(pixelsService.getUri((ome.model.core.Image) new IceMapper().reverse(image))); - } - - @Test - public void testGetUriNoUuid() throws ApiUsageException, IOException { - addExternalInfo(mask, ENTITY_ID, ENTITY_TYPE, labelUri, null); - Assert.assertEquals(pixelsService.getUri((ome.model.roi.Mask) new IceMapper().reverse(mask)), labelUri); - - addExternalInfo(image, ENTITY_ID, ENTITY_TYPE, imageUri, null); - Assert.assertEquals(pixelsService.getUri((ome.model.core.Image) new IceMapper().reverse(image)), imageUri); - } - - @Test - public void testGetUriNoLsid() throws ApiUsageException, IOException { - addExternalInfo(mask, ENTITY_ID, ENTITY_TYPE, null, uuid); - Assert.assertNull(pixelsService.getUri((ome.model.roi.Mask) new IceMapper().reverse(mask))); - - addExternalInfo(image, ENTITY_ID, ENTITY_TYPE, null, uuid); - Assert.assertNull(pixelsService.getUri((ome.model.core.Image) new IceMapper().reverse(image))); - } - - @Test - public void testGetUriWrongEntityType() throws ApiUsageException, IOException { - addExternalInfo(mask, ENTITY_ID, "multiscales", labelUri, uuid); - Assert.assertNull(pixelsService.getUri((ome.model.roi.Mask) new IceMapper().reverse(mask))); - - addExternalInfo(image, ENTITY_ID, "multiscales", imageUri, uuid); - Assert.assertNull(pixelsService.getUri((ome.model.core.Image) new IceMapper().reverse(image))); - } - - @Test - public void testGetUriWrongEntityId() throws ApiUsageException, IOException { - addExternalInfo(mask, 1, ENTITY_TYPE, labelUri, uuid); - Assert.assertNull(pixelsService.getUri((ome.model.roi.Mask) new IceMapper().reverse(mask))); - - addExternalInfo(image, 1, ENTITY_TYPE, imageUri, uuid); - Assert.assertNull(pixelsService.getUri((ome.model.core.Image) new IceMapper().reverse(image))); - } -}