From eea6f1fbe324c5ffe73b2b0b1a4c0ca5fda9adda Mon Sep 17 00:00:00 2001 From: Marwan Zouinkhi Date: Mon, 5 May 2025 11:31:20 -0400 Subject: [PATCH 1/4] generate url links and process them --- pom.xml | 6 ++ src/main/java/bdv/BigDataViewer.java | 2 +- .../bdv/tools/links/BDVLinkHandlerPlugin.java | 101 ++++++++++++++++++ .../java/bdv/tools/links/LinkActions.java | 24 +++++ src/main/java/bdv/tools/links/Links.java | 11 ++ src/main/resources/bdv/ui/keymap/default.yaml | 6 +- 6 files changed, 148 insertions(+), 2 deletions(-) create mode 100644 src/main/java/bdv/tools/links/BDVLinkHandlerPlugin.java diff --git a/pom.xml b/pom.xml index a4658711..abc445f6 100644 --- a/pom.xml +++ b/pom.xml @@ -142,6 +142,7 @@ org.bigdataviewer.core bsd_2 BigDataViewer developers. + 11 7.1.4 0.17.2 @@ -243,6 +244,11 @@ org.slf4j slf4j-simple + + org.scijava + scijava-links + 1.0.0 + diff --git a/src/main/java/bdv/BigDataViewer.java b/src/main/java/bdv/BigDataViewer.java index d1cfd763..b41f2ef9 100644 --- a/src/main/java/bdv/BigDataViewer.java +++ b/src/main/java/bdv/BigDataViewer.java @@ -878,7 +878,7 @@ public void collapseCardPanel() public static void main( final String[] args ) { - final String fn = "/Users/pietzsch/workspace/data/111010_weber_resave.xml"; + final String fn = "/Users/zouinkhim/Downloads/grid-3d-stitched-h5/dataset.xml"; try { System.setProperty( "apple.laf.useScreenMenuBar", "true" ); diff --git a/src/main/java/bdv/tools/links/BDVLinkHandlerPlugin.java b/src/main/java/bdv/tools/links/BDVLinkHandlerPlugin.java new file mode 100644 index 00000000..94ec4e84 --- /dev/null +++ b/src/main/java/bdv/tools/links/BDVLinkHandlerPlugin.java @@ -0,0 +1,101 @@ +/*- + * #%L + * BigDataViewer core classes with minimal dependencies. + * %% + * Copyright (C) 2012 - 2025 BigDataViewer developers. + * %% + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * #L% + */ +import bdv.util.Bdv; +import bdv.util.BdvFunctions; +import bdv.util.BdvOptions; +import bdv.util.BdvStackSource; +import net.imglib2.RandomAccessibleInterval; +import net.imglib2.img.array.ArrayImgs; +import net.imglib2.type.numeric.integer.UnsignedByteType; +import org.janelia.saalfeldlab.n5.N5Reader; +import org.scijava.links.AbstractLinkHandler; +import org.scijava.links.LinkHandler; +import org.scijava.plugin.Parameter; +import org.scijava.plugin.Plugin; +import org.scijava.ui.UIService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.JsonParseException; + +import javax.swing.*; + +import java.io.UnsupportedEncodingException; +import java.net.URI; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; + +@Plugin(type = LinkHandler.class) +public class BDVLinkHandlerPlugin extends AbstractLinkHandler { + + private static final Logger LOG = LoggerFactory.getLogger( LinkActions.class ); + + public static final String PLUGIN_NAME = "BDV"; + + @Parameter + private UIService uiService; + + @Override + public void handle(final URI uri){ + if (!supports(uri)) throw new UnsupportedOperationException("" + uri); + String query = uri.getQuery(); + if (query == null || query.isEmpty()) { + // TODO open an empty BDV window + throw new UnsupportedOperationException("Not implemented yet"); + } else { + String decoded_query; + try{ + decoded_query = URLDecoder.decode(query, StandardCharsets.UTF_8.name()); + } catch (UnsupportedEncodingException e) { + LOG.error("Failed to decode JSON from URI: {}", uri, e); + return; + } + try + { + // TODO handle the decoded JSON query + // Links.paste( decoded_query, panel, converterSetups, pasteSettings, resources ); + throw new UnsupportedOperationException("Not implemented yet"); + } + catch ( final JsonParseException | IllegalArgumentException e ) + { + LOG.debug( "pasted JSON is malformed:\n\"{}\"", pastedText, e ); + } + } + + } + + + + @Override + public boolean supports(final URI uri) { + return super.supports(uri) && PLUGIN_NAME.equals(org.scijava.links.Links.operation(uri)); + } + + +} \ No newline at end of file diff --git a/src/main/java/bdv/tools/links/LinkActions.java b/src/main/java/bdv/tools/links/LinkActions.java index a6514b50..9c47d5f2 100644 --- a/src/main/java/bdv/tools/links/LinkActions.java +++ b/src/main/java/bdv/tools/links/LinkActions.java @@ -30,6 +30,8 @@ import static bdv.tools.links.ClipboardUtils.getFromClipboard; +import java.io.UnsupportedEncodingException; + import org.scijava.plugin.Plugin; import org.scijava.ui.behaviour.io.gui.CommandDescriptionProvider; import org.scijava.ui.behaviour.io.gui.CommandDescriptions; @@ -53,9 +55,11 @@ public class LinkActions public static final String COPY_VIEWER_STATE = "copy viewer state"; public static final String PASTE_VIEWER_STATE = "paste viewer state"; + public static final String GENERATE_LINK_VIEWER_STATE = "generate link viewer state"; public static final String[] COPY_VIEWER_STATE_KEYS = new String[] { "ctrl C", "meta C" }; public static final String[] PASTE_VIEWER_STATE_KEYS = new String[] { "ctrl V", "meta V" }; + public static final String[] GENERATE_LINK_VIEWER_STATE_KEYS = new String[] { "ctrl L", "meta L" }; /* * Command descriptions for all provided commands @@ -73,6 +77,7 @@ public void getCommandDescriptions( final CommandDescriptions descriptions ) { descriptions.add( COPY_VIEWER_STATE, COPY_VIEWER_STATE_KEYS, "Copy the current viewer state as a string." ); descriptions.add( PASTE_VIEWER_STATE, PASTE_VIEWER_STATE_KEYS, "Paste the current viewer state from a string." ); + descriptions.add( GENERATE_LINK_VIEWER_STATE, GENERATE_LINK_VIEWER_STATE_KEYS, "Generate a fiji uri link to the current viewer state and copy it to the clipboard." ); } } @@ -85,6 +90,22 @@ private static void copyViewerState( ClipboardUtils.copyToClipboard( json.toString() ); } + private static void generateLinkViewerState( + final AbstractViewerPanel panel, + final ConverterSetups converterSetups, + final ResourceManager resources ) +{ + final JsonElement json = Links.copyJson( panel, converterSetups, resources ); + try{ + final String link = Links.generateLink( json ); + ClipboardUtils.copyToClipboard( link); + LOG.debug( "Generated link: {}", link ); + } + catch (final UnsupportedEncodingException e) { + LOG.debug( "couldn't generate link from JSON:\n\"{}\"", json, e ); + } +} + private static void pasteViewerState( final AbstractViewerPanel panel, final ConverterSetups converterSetups, @@ -133,5 +154,8 @@ public static void install( COPY_VIEWER_STATE, COPY_VIEWER_STATE_KEYS ); actions.runnableAction( () -> pasteViewerState( panel, converterSetups, pasteSettings, resources ), PASTE_VIEWER_STATE, PASTE_VIEWER_STATE_KEYS ); + actions.runnableAction( () -> generateLinkViewerState( panel, converterSetups, resources ), + GENERATE_LINK_VIEWER_STATE, GENERATE_LINK_VIEWER_STATE_KEYS ); + } } diff --git a/src/main/java/bdv/tools/links/Links.java b/src/main/java/bdv/tools/links/Links.java index 7f92eb80..fa2c4287 100644 --- a/src/main/java/bdv/tools/links/Links.java +++ b/src/main/java/bdv/tools/links/Links.java @@ -6,7 +6,10 @@ import static bdv.tools.links.PasteSettings.SourceMatchingMethod.BY_INDEX; import static bdv.tools.links.PasteSettings.SourceMatchingMethod.BY_SPEC_LOAD_MISSING; +import java.io.UnsupportedEncodingException; import java.lang.reflect.Type; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.util.Arrays; import java.util.List; @@ -41,6 +44,8 @@ class Links { private static final Logger LOG = LoggerFactory.getLogger( Links.class ); + final static String BASE_URL = "fiji://bdv?"; + static JsonElement copyJson( final AbstractViewerPanel panel, final ConverterSetups converterSetups, @@ -413,5 +418,11 @@ public JsonElement serialize( } } } + + public static String generateLink(JsonElement json) throws UnsupportedEncodingException{ + final String jsonString = json.toString(); + return BASE_URL + java.net.URLEncoder.encode(jsonString, java.nio.charset.StandardCharsets.UTF_8.name()); + } + } diff --git a/src/main/resources/bdv/ui/keymap/default.yaml b/src/main/resources/bdv/ui/keymap/default.yaml index 918ca1a2..abba40a2 100644 --- a/src/main/resources/bdv/ui/keymap/default.yaml +++ b/src/main/resources/bdv/ui/keymap/default.yaml @@ -394,4 +394,8 @@ - !mapping action: paste viewer state contexts: [bdv] - triggers: [ctrl V, meta V] \ No newline at end of file + triggers: [ctrl V, meta V] +- !mapping + action: generate link viewer state + contexts: [bdv] + triggers: [ctrl L, meta L] \ No newline at end of file From 2d8a2fa777bfb58f0e159b8452ac72829fd571c4 Mon Sep 17 00:00:00 2001 From: Marwan Zouinkhi Date: Mon, 5 May 2025 11:34:46 -0400 Subject: [PATCH 2/4] remove debug changes --- src/main/java/bdv/BigDataViewer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/bdv/BigDataViewer.java b/src/main/java/bdv/BigDataViewer.java index b41f2ef9..d1cfd763 100644 --- a/src/main/java/bdv/BigDataViewer.java +++ b/src/main/java/bdv/BigDataViewer.java @@ -878,7 +878,7 @@ public void collapseCardPanel() public static void main( final String[] args ) { - final String fn = "/Users/zouinkhim/Downloads/grid-3d-stitched-h5/dataset.xml"; + final String fn = "/Users/pietzsch/workspace/data/111010_weber_resave.xml"; try { System.setProperty( "apple.laf.useScreenMenuBar", "true" ); From 94a71879af483f1b6dd6134e276daa64dd5a0549 Mon Sep 17 00:00:00 2001 From: Marwan Zouinkhi Date: Mon, 5 May 2025 11:54:18 -0400 Subject: [PATCH 3/4] remove link handler, will be a separate project --- .../bdv/tools/links/BDVLinkHandlerPlugin.java | 101 ------------------ 1 file changed, 101 deletions(-) delete mode 100644 src/main/java/bdv/tools/links/BDVLinkHandlerPlugin.java diff --git a/src/main/java/bdv/tools/links/BDVLinkHandlerPlugin.java b/src/main/java/bdv/tools/links/BDVLinkHandlerPlugin.java deleted file mode 100644 index 94ec4e84..00000000 --- a/src/main/java/bdv/tools/links/BDVLinkHandlerPlugin.java +++ /dev/null @@ -1,101 +0,0 @@ -/*- - * #%L - * BigDataViewer core classes with minimal dependencies. - * %% - * Copyright (C) 2012 - 2025 BigDataViewer developers. - * %% - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * #L% - */ -import bdv.util.Bdv; -import bdv.util.BdvFunctions; -import bdv.util.BdvOptions; -import bdv.util.BdvStackSource; -import net.imglib2.RandomAccessibleInterval; -import net.imglib2.img.array.ArrayImgs; -import net.imglib2.type.numeric.integer.UnsignedByteType; -import org.janelia.saalfeldlab.n5.N5Reader; -import org.scijava.links.AbstractLinkHandler; -import org.scijava.links.LinkHandler; -import org.scijava.plugin.Parameter; -import org.scijava.plugin.Plugin; -import org.scijava.ui.UIService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.gson.JsonParseException; - -import javax.swing.*; - -import java.io.UnsupportedEncodingException; -import java.net.URI; -import java.net.URLDecoder; -import java.nio.charset.StandardCharsets; - -@Plugin(type = LinkHandler.class) -public class BDVLinkHandlerPlugin extends AbstractLinkHandler { - - private static final Logger LOG = LoggerFactory.getLogger( LinkActions.class ); - - public static final String PLUGIN_NAME = "BDV"; - - @Parameter - private UIService uiService; - - @Override - public void handle(final URI uri){ - if (!supports(uri)) throw new UnsupportedOperationException("" + uri); - String query = uri.getQuery(); - if (query == null || query.isEmpty()) { - // TODO open an empty BDV window - throw new UnsupportedOperationException("Not implemented yet"); - } else { - String decoded_query; - try{ - decoded_query = URLDecoder.decode(query, StandardCharsets.UTF_8.name()); - } catch (UnsupportedEncodingException e) { - LOG.error("Failed to decode JSON from URI: {}", uri, e); - return; - } - try - { - // TODO handle the decoded JSON query - // Links.paste( decoded_query, panel, converterSetups, pasteSettings, resources ); - throw new UnsupportedOperationException("Not implemented yet"); - } - catch ( final JsonParseException | IllegalArgumentException e ) - { - LOG.debug( "pasted JSON is malformed:\n\"{}\"", pastedText, e ); - } - } - - } - - - - @Override - public boolean supports(final URI uri) { - return super.supports(uri) && PLUGIN_NAME.equals(org.scijava.links.Links.operation(uri)); - } - - -} \ No newline at end of file From 5b72d6a6734cb6789861e8b29138289da5edf5a2 Mon Sep 17 00:00:00 2001 From: Marwan Zouinkhi Date: Mon, 5 May 2025 11:56:09 -0400 Subject: [PATCH 4/4] remove links dep --- pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/pom.xml b/pom.xml index abc445f6..a4658711 100644 --- a/pom.xml +++ b/pom.xml @@ -142,7 +142,6 @@ org.bigdataviewer.core bsd_2 BigDataViewer developers. - 11 7.1.4 0.17.2 @@ -244,11 +243,6 @@ org.slf4j slf4j-simple - - org.scijava - scijava-links - 1.0.0 -