Skip to content

Commit 25c6cc8

Browse files
committed
update link handling logic
1 parent 8d7e20e commit 25c6cc8

File tree

3 files changed

+44
-51
lines changed

3 files changed

+44
-51
lines changed

src/main/java/org/scijava/links/FijiURILink.java

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,6 @@
3131
import java.net.URI;
3232
import java.util.LinkedHashMap;
3333
import java.util.Map;
34-
import java.util.Arrays;
35-
import java.net.URI;
36-
import java.net.URISyntaxException;
37-
import java.nio.charset.StandardCharsets;
38-
import java.util.Objects;
3934

4035
/**
4136
* Utility class for working with {@link URI} objects.
@@ -44,11 +39,12 @@
4439
*/
4540
public final class FijiURILink {
4641

42+
public static final String FIJI_SCHEME = "fiji";
4743

48-
private final String plugin; // e.g., "BDV"
49-
private final String subPlugin; // e.g., "open" (nullable)
50-
private final String query; // e.g., "a=1&b=2" (nullable)
51-
private final String rawQuery; // e.g., "a=1&b=2" (nullable)
44+
private final String plugin; // e.g., "BDV"
45+
private final String subPlugin; // e.g., "open" (nullable)
46+
private final String query; // e.g., "a=1&b=2" (nullable)
47+
private final String rawQuery; // e.g., "a=1&b=2" (nullable)
5248

5349
private FijiURILink(String plugin, String subPlugin, String query, String rawQuery) {
5450
this.plugin = plugin;
@@ -58,13 +54,15 @@ private FijiURILink(String plugin, String subPlugin, String query, String rawQue
5854
}
5955

6056
public static FijiURILink parse(String uriString) {
61-
Objects.requireNonNull(uriString, "uriString");
62-
final URI uri;
6357
try {
64-
uri = new URI(uriString);
65-
} catch (URISyntaxException e) {
58+
URI uri = URI.create(uriString);
59+
return parse(uri);
60+
} catch (IllegalArgumentException e) {
6661
throw new IllegalArgumentException("Invalid URI: " + uriString, e);
6762
}
63+
}
64+
65+
public static FijiURILink parse(URI uri) {
6866

6967
if (!"fiji".equalsIgnoreCase(uri.getScheme())) {
7068
throw new IllegalArgumentException("Scheme must be fiji://");
@@ -87,15 +85,27 @@ public static FijiURILink parse(String uriString) {
8785
// Raw query (no '?'), leave as-is; users can parse if they want.
8886
String q = uri.getQuery();
8987
// Optional: decode percent-escapes (uncomment if desired)
90-
// q = (q == null) ? null : java.net.URLDecoder.decode(q, StandardCharsets.UTF_8);
88+
// q = (q == null) ? null : java.net.URLDecoder.decode(q,
89+
// StandardCharsets.UTF_8);
9190
String raw = uri.getRawQuery();
9291
return new FijiURILink(plugin, sub, q, raw);
9392
}
9493

95-
public String getPlugin() { return plugin; }
96-
public String getSubPlugin() { return subPlugin; } // may be null
97-
public String getQuery() { return query; } // may be null
98-
public String getRawQuery() { return rawQuery; } // may be null
94+
public String getPlugin() {
95+
return plugin;
96+
}
97+
98+
public String getSubPlugin() {
99+
return subPlugin;
100+
} // may be null
101+
102+
public String getQuery() {
103+
return query;
104+
} // may be null
105+
106+
public String getRawQuery() {
107+
return rawQuery;
108+
} // may be null
99109

100110
public Map<String, String> getParsedQuery() {
101111
final LinkedHashMap<String, String> map = new LinkedHashMap<>();
@@ -109,16 +119,13 @@ public Map<String, String> getParsedQuery() {
109119
return map;
110120
}
111121

112-
@Override public String toString() {
122+
@Override
123+
public String toString() {
113124
StringBuilder sb = new StringBuilder("fiji://").append(plugin);
114-
if (subPlugin != null) sb.append('/').append(subPlugin);
115-
if (query != null) sb.append('?').append(query);
125+
if (subPlugin != null)
126+
sb.append('/').append(subPlugin);
127+
if (query != null)
128+
sb.append('?').append(query);
116129
return sb.toString();
117130
}
118-
119-
// Convenience helper: returns null instead of throwing
120-
public static FijiURILink tryParse(String uriString) {
121-
try { return parse(uriString); } catch (RuntimeException e) { return null; }
122-
}
123131
}
124-

src/main/java/org/scijava/links/LinkHandler.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
/**
3636
* A plugin for handling URI links.
3737
*
38-
* @author Curtis Rueden
38+
* @author Curtis Rueden, Marwan Zouinkhi
3939
*/
4040
public interface LinkHandler extends HandlerPlugin<URI> {
4141

@@ -46,8 +46,14 @@ public interface LinkHandler extends HandlerPlugin<URI> {
4646
*/
4747
void handle(URI uri);
4848

49+
String getName();
50+
4951
@Override
5052
default Class<URI> getType() {
5153
return URI.class;
5254
}
55+
56+
default public boolean supports(final URI uri) {
57+
return FijiURILink.parse(uri).getPlugin().toUpperCase().equals(getName().toUpperCase());
58+
}
5359
}

src/test/java/org/scijava/links/LinksTest.java

Lines changed: 3 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,13 @@
2828
*/
2929

3030
package org.scijava.links;
31-
32-
import org.junit.Test;
33-
34-
3531
import java.util.Map;
32+
import org.junit.Test;
3633

3734
import static org.junit.Assert.assertEquals;
3835
import static org.junit.Assert.assertNotNull;
3936
import static org.junit.Assert.assertNull;
4037
import static org.junit.Assert.assertThrows;
41-
import static org.junit.Assert.assertTrue;
4238

4339

4440
public class LinksTest {
@@ -103,36 +99,20 @@ public void toString_roundTrips_reasonably() {
10399

104100
@Test
105101
public void rejectsWrongScheme() {
106-
IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
102+
assertThrows(IllegalArgumentException.class,
107103
() -> FijiURILink.parse("http://BDV/open?x=1"));
108-
assertTrue(ex.getMessage().contains("Scheme must be fiji://"));
109104
}
110105

111-
@Test
112-
public void rejectsMissingPlugin() {
113-
IllegalArgumentException ex = assertThrows(IllegalArgumentException.class,
114-
() -> FijiURILink.parse("fiji:///open?x=1"));
115-
assertTrue(ex.getMessage().contains("Missing plugin name"));
116-
}
117106

118107
@Test
119108
public void rejectsInvalidUriSyntax() {
120109
assertThrows(IllegalArgumentException.class,
121110
() -> FijiURILink.parse("fiji://BDV/open?bad|query"));
122111
}
123112

124-
125-
126-
@Test
127-
public void returnsNullOnError() {
128-
assertNull(FijiURILink.tryParse("not-a-uri"));
129-
assertNull(FijiURILink.tryParse("http://BDV")); // wrong scheme
130-
assertNull(FijiURILink.tryParse("fiji:///"));
131-
}
132-
133113
@Test
134114
public void returnsObjectOnSuccess() {
135-
FijiURILink ok = FijiURILink.tryParse("fiji://BDV/open?q=ok");
115+
FijiURILink ok = FijiURILink.parse("fiji://BDV/open?q=ok");
136116
assertNotNull(ok);
137117
assertEquals("BDV", ok.getPlugin());
138118
assertEquals("open", ok.getSubPlugin());

0 commit comments

Comments
 (0)