Skip to content

Commit 32b9a40

Browse files
committed
Fix platform access to LinkService
1 parent 1322059 commit 32b9a40

File tree

4 files changed

+117
-91
lines changed

4 files changed

+117
-91
lines changed

src/main/java/org/scijava/desktop/links/DefaultLinkService.java

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,16 @@
2828
*/
2929
package org.scijava.desktop.links;
3030

31+
import java.awt.Desktop;
32+
import java.net.URI;
33+
import java.util.Arrays;
34+
import java.util.Collections;
35+
import java.util.HashSet;
36+
import java.util.Set;
37+
38+
import org.scijava.desktop.DesktopIntegrationProvider;
3139
import org.scijava.event.ContextCreatedEvent;
3240
import org.scijava.event.EventHandler;
33-
import org.scijava.desktop.DesktopIntegrationProvider;
3441
import org.scijava.log.LogService;
3542
import org.scijava.platform.Platform;
3643
import org.scijava.platform.PlatformService;
@@ -39,11 +46,6 @@
3946
import org.scijava.plugin.Plugin;
4047
import org.scijava.service.Service;
4148

42-
import java.awt.Desktop;
43-
import java.net.URI;
44-
import java.util.HashSet;
45-
import java.util.Set;
46-
4749
/**
4850
* Default implementation of {@link LinkService}.
4951
*
@@ -58,6 +60,25 @@ public class DefaultLinkService extends AbstractHandlerService<URI, LinkHandler>
5860
@Parameter(required = false)
5961
private PlatformService platformService;
6062

63+
private final Set<String> extensions = new HashSet<>();
64+
65+
/**
66+
* Gets supported file extensions.
67+
*/
68+
@Override
69+
public Set<String> getFileExtensions() {
70+
return Collections.unmodifiableSet(extensions);
71+
}
72+
73+
/**
74+
* Gets supported file extensions.
75+
*/
76+
@Override
77+
public void addFileExtensions(final String... extensions) {
78+
this.extensions.addAll(Arrays.asList(extensions));
79+
}
80+
81+
6182
@EventHandler
6283
private void onEvent(final ContextCreatedEvent evt) {
6384
// Register URI handler with the desktop system, if possible.

src/main/java/org/scijava/desktop/links/LinkService.java

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,15 @@
2828
*/
2929
package org.scijava.desktop.links;
3030

31+
import java.net.URI;
32+
import java.util.HashSet;
33+
import java.util.Optional;
34+
import java.util.Set;
35+
3136
import org.scijava.log.Logger;
3237
import org.scijava.plugin.HandlerService;
3338
import org.scijava.service.SciJavaService;
3439

35-
import java.net.URI;
36-
import java.util.Optional;
37-
3840
/**
3941
* Service interface for handling URIs.
4042
*
@@ -45,6 +47,16 @@ public interface LinkService extends HandlerService<URI, LinkHandler>,
4547
SciJavaService
4648
{
4749

50+
/**
51+
* Gets the set of supported file extensions.
52+
*/
53+
public Set<String> getFileExtensions();
54+
55+
/**
56+
* Adds to the set of supported file extensions.
57+
*/
58+
public void addFileExtensions(final String... extension);
59+
4860
default void handle(final URI uri) {
4961
// Find the highest-priority link handler plugin which matches, if any.
5062
final Optional<LinkHandler> match = getInstances().stream() //
@@ -60,6 +72,15 @@ default void handle(final URI uri) {
6072
match.get().handle(uri);
6173
}
6274

75+
default Set<String> getSchemes() {
76+
var schemes = new HashSet<String>();
77+
for (final LinkHandler handler : getInstances()) {
78+
final var handlerSchemes = handler.getSchemes();
79+
if (handlerSchemes != null) schemes.addAll(handlerSchemes);
80+
}
81+
return schemes;
82+
}
83+
6384
// -- PTService methods --
6485

6586
@Override

src/main/java/org/scijava/desktop/platform/linux/LinuxPlatform.java

Lines changed: 31 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,9 @@
2929

3030
package org.scijava.desktop.platform.linux;
3131

32+
import org.scijava.Context;
3233
import org.scijava.app.AppService;
3334
import org.scijava.desktop.DesktopIntegrationProvider;
34-
import org.scijava.desktop.links.LinkHandler;
3535
import org.scijava.desktop.links.LinkService;
3636
import org.scijava.desktop.links.SchemeInstaller;
3737
import org.scijava.log.LogService;
@@ -47,9 +47,8 @@
4747
import java.nio.file.Path;
4848
import java.nio.file.Paths;
4949
import java.nio.file.StandardOpenOption;
50-
import java.util.HashSet;
50+
import java.util.Collections;
5151
import java.util.LinkedHashMap;
52-
import java.util.List;
5352
import java.util.Map;
5453
import java.util.Set;
5554

@@ -74,7 +73,7 @@ public class LinuxPlatform extends AbstractPlatform
7473
{
7574

7675
@Parameter
77-
private LinkService linkService;
76+
private Context context;
7877

7978
@Parameter
8079
private AppService appService;
@@ -120,20 +119,16 @@ public void open(final URL url) throws IOException {
120119
public boolean isWebLinksEnabled() {
121120
try {
122121
final DesktopFile df = getOrCreateDesktopFile();
123-
final Set<String> schemes = collectSchemes();
124-
if (schemes.isEmpty()) return false;
125122

126123
// Check if any scheme is registered
127-
for (final String scheme : schemes) {
124+
for (final String scheme : schemes()) {
128125
if (df.hasMimeType("x-scheme-handler/" + scheme)) return true;
129126
}
130-
return false;
131-
} catch (final IOException e) {
132-
if (log != null) {
133-
log.debug("Failed to check web links status", e);
134-
}
135-
return false;
136127
}
128+
catch (final IOException e) {
129+
if (log != null) log.debug("Failed to check web links status", e);
130+
}
131+
return false;
137132
}
138133

139134
@Override
@@ -143,14 +138,10 @@ public boolean isWebLinksEnabled() {
143138
public void setWebLinksEnabled(final boolean enable) throws IOException {
144139
final DesktopFile df = getOrCreateDesktopFile();
145140

146-
final Set<String> schemes = collectSchemes();
147-
for (final String scheme : schemes) {
141+
for (final String scheme : schemes()) {
148142
final String mimeType = "x-scheme-handler/" + scheme;
149-
if (enable) {
150-
df.addMimeType(mimeType);
151-
} else {
152-
df.removeMimeType(mimeType);
153-
}
143+
if (enable) df.addMimeType(mimeType);
144+
else df.removeMimeType(mimeType);
154145
}
155146

156147
df.save();
@@ -269,14 +260,13 @@ public void setFileExtensionsEnabled(final boolean enable) throws IOException {
269260
// Remove file extension MIME types from .desktop file
270261
// Keep URI scheme handlers (x-scheme-handler/...)
271262
final DesktopFile df = getOrCreateDesktopFile();
272-
final Set<String> uriSchemes = collectSchemes();
273263

274264
for (final String mimeType : mimeMapping.values()) {
275265
df.removeMimeType(mimeType);
276266
}
277267

278268
// Re-add URI scheme handlers
279-
for (final String scheme : uriSchemes) {
269+
for (final String scheme : schemes()) {
280270
df.addMimeType("x-scheme-handler/" + scheme);
281271
}
282272

@@ -397,20 +387,23 @@ private String sanitizeFileName(final String name) {
397387

398388
// -- Helper methods --
399389

400-
/**
401-
* Collects all URI schemes from registered LinkHandler plugins.
402-
*/
403-
private Set<String> collectSchemes() {
404-
final Set<String> schemes = new HashSet<>();
405-
if (linkService == null) return schemes;
406-
407-
for (final LinkHandler handler : linkService.getInstances()) {
408-
final List<String> handlerSchemes = handler.getSchemes();
409-
if (handlerSchemes != null) {
410-
schemes.addAll(handlerSchemes);
411-
}
412-
}
413-
return schemes;
390+
private LinkService linkService() {
391+
// NB: We cannot declare LinkService as an @Parameter because
392+
// the PlatformService creates its plugin singletons before the
393+
// LinkService has been instantiated and added to the context.
394+
return context.getService(LinkService.class);
395+
}
396+
397+
private Set<String> schemes() {
398+
final LinkService linkService = linkService();
399+
return linkService == null ?
400+
Collections.emptySet() : linkService.getSchemes();
401+
}
402+
403+
private Set<String> extensions() {
404+
final LinkService linkService = linkService();
405+
return linkService == null ?
406+
Collections.emptySet() : linkService.getFileExtensions();
414407
}
415408

416409
/**
@@ -421,8 +414,8 @@ private synchronized Map<String, String> loadMimeTypeMapping() throws IOExceptio
421414

422415
extensionToMime = new LinkedHashMap<>();
423416

424-
// TODO: We need public API in LinkService for registering the extensions we want.
425-
// TODO: Then, in fiji-links, we can use that API to plug in all the SCIFIO-supported file formats.
417+
final Set<String> extensions = extensions();
418+
// TODO: How do we know the MIME type of each extension?
426419

427420
return extensionToMime;
428421
}

0 commit comments

Comments
 (0)