Skip to content

Commit cf652ef

Browse files
committed
Migrate desktop platform business logic to service
The OptionsDesktop plugin was doing too much. And we need that logic for use elsewhere also.
1 parent 52a7217 commit cf652ef

3 files changed

Lines changed: 113 additions & 70 deletions

File tree

src/main/java/org/scijava/desktop/DefaultDesktopService.java

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
package org.scijava.desktop;
3030

3131
import org.scijava.log.LogService;
32+
import org.scijava.platform.PlatformService;
3233
import org.scijava.plugin.Parameter;
3334
import org.scijava.plugin.Plugin;
3435
import org.scijava.service.AbstractService;
@@ -42,6 +43,7 @@
4243
import java.util.Collections;
4344
import java.util.HashMap;
4445
import java.util.Map;
46+
import java.util.stream.Stream;
4547

4648
/**
4749
* Default implementation of {@link DesktopService}.
@@ -51,6 +53,9 @@
5153
@Plugin(type = Service.class)
5254
public class DefaultDesktopService extends AbstractService implements DesktopService {
5355

56+
@Parameter
57+
private PlatformService platformService;
58+
5459
@Parameter(required = false)
5560
private LogService log;
5661

@@ -65,6 +70,58 @@ public class DefaultDesktopService extends AbstractService implements DesktopSer
6570
/** Cached contents of {@code mime-types.txt}, keyed by extension (no leading dot). */
6671
private Map<String, String> mimeDB;
6772

73+
@Override
74+
public void syncDesktopIntegration(final boolean webLinks,
75+
final boolean desktopIcon, final boolean fileTypes)
76+
{
77+
desktopPlatforms().forEach(p -> {
78+
// Resolve each feature's desired state: use the passed value
79+
// if toggleable, otherwise preserve the current platform state.
80+
final boolean webLinks2 = p.isWebLinksToggleable()
81+
? webLinks : p.isWebLinksEnabled();
82+
final boolean desktopIcon2 = p.isDesktopIconToggleable()
83+
? desktopIcon : p.isDesktopIconPresent();
84+
final boolean fileTypes2 = p.isFileExtensionsToggleable()
85+
? fileTypes : p.isFileExtensionsEnabled();
86+
try {
87+
p.syncDesktopIntegration(webLinks2, desktopIcon2, fileTypes2);
88+
}
89+
catch (final IOException e) {
90+
if (log != null) log.error("Error performing desktop integration", e);
91+
}
92+
});
93+
}
94+
95+
@Override
96+
public boolean isDesktopIconToggleable() {
97+
return desktopPlatforms().anyMatch(p -> p.isDesktopIconToggleable());
98+
}
99+
100+
@Override
101+
public boolean isDesktopIconPresent() {
102+
return desktopPlatforms().allMatch(p -> p.isDesktopIconPresent());
103+
}
104+
105+
@Override
106+
public boolean isWebLinksToggleable() {
107+
return desktopPlatforms().anyMatch(p -> p.isWebLinksToggleable());
108+
}
109+
110+
@Override
111+
public boolean isWebLinksEnabled() {
112+
return desktopPlatforms().allMatch(p -> p.isWebLinksEnabled());
113+
}
114+
115+
@Override
116+
public boolean isFileExtensionsToggleable() {
117+
return desktopPlatforms().anyMatch(p -> p.isFileExtensionsToggleable());
118+
}
119+
120+
@Override
121+
public boolean isFileExtensionsEnabled() {
122+
return desktopPlatforms().allMatch(p -> p.isFileExtensionsEnabled());
123+
}
124+
68125
@Override
69126
public void addFileType(final String ext,
70127
final String mimeType, final String description)
@@ -168,4 +225,12 @@ private synchronized void initMimeDB() {
168225
}
169226
mimeDB = db;
170227
}
228+
229+
// -- Helper methods --
230+
231+
private Stream<DesktopIntegrationProvider> desktopPlatforms() {
232+
return platformService.getTargetPlatforms().stream() //
233+
.filter(p -> p instanceof DesktopIntegrationProvider) //
234+
.map(p -> (DesktopIntegrationProvider) p);
235+
}
171236
}

src/main/java/org/scijava/desktop/DesktopService.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,39 @@
4040
*/
4141
public interface DesktopService extends SciJavaService {
4242

43+
/**
44+
* Applies desktop integration settings.
45+
* <p>
46+
* The behavior of each setting is platform-specific;
47+
* not all settings have an effect on every platform.
48+
* </p>
49+
*
50+
* @param webLinks whether URI scheme handlers should be registered
51+
* @param desktopIcon whether the application launcher entry should be present
52+
* @param fileTypes whether file-extension associations should be registered
53+
* @throws IOException if any part of the update fails
54+
*/
55+
void syncDesktopIntegration(boolean webLinks,
56+
boolean desktopIcon, boolean fileTypes);
57+
58+
/** TODO javadoc */
59+
boolean isDesktopIconToggleable();
60+
61+
/** TODO javadoc */
62+
boolean isDesktopIconPresent();
63+
64+
/** TODO javadoc */
65+
boolean isWebLinksToggleable();
66+
67+
/** TODO javadoc */
68+
boolean isWebLinksEnabled();
69+
70+
/** TODO javadoc */
71+
boolean isFileExtensionsToggleable();
72+
73+
/** TODO javadoc */
74+
boolean isFileExtensionsEnabled();
75+
4376
/**
4477
* Adds a single file type.
4578
*

src/main/java/org/scijava/desktop/options/OptionsDesktop.java

Lines changed: 15 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -29,16 +29,12 @@
2929

3030
package org.scijava.desktop.options;
3131

32-
import java.io.IOException;
33-
import java.util.stream.Stream;
34-
3532
import org.scijava.ItemVisibility;
36-
import org.scijava.desktop.DesktopIntegrationProvider;
33+
import org.scijava.desktop.DesktopService;
3734
import org.scijava.log.LogService;
3835
import org.scijava.module.ModuleItem;
3936
import org.scijava.module.MutableModuleItem;
4037
import org.scijava.options.OptionsPlugin;
41-
import org.scijava.platform.PlatformService;
4238
import org.scijava.plugin.Parameter;
4339
import org.scijava.plugin.Plugin;
4440

@@ -56,7 +52,7 @@
5652
public class OptionsDesktop extends OptionsPlugin {
5753

5854
@Parameter
59-
private PlatformService platformService;
55+
private DesktopService desktopService;
6056

6157
@Parameter(required = false)
6258
private LogService log;
@@ -73,50 +69,33 @@ public void initialize() {
7369
"Enable web links",
7470
"Allow handling of URI link schemes from web browsers",
7571
"Web links always enabled", "Web links always disabled",
76-
isWebLinksToggleable(), isWebLinksEnabled());
72+
desktopService.isWebLinksToggleable(),
73+
desktopService.isWebLinksEnabled());
7774
}
7875
if (desktopIconItem == null) {
7976
desktopIconItem = createInput("desktopIconPresent",
8077
"Add desktop icon",
8178
"Install application icon in the system menu",
8279
"Icon always present", "Icon installation not implemented",
83-
isDesktopIconToggleable(), isDesktopIconPresent());
80+
desktopService.isDesktopIconToggleable(),
81+
desktopService.isDesktopIconPresent());
8482
}
8583
if (fileTypesItem == null) {
8684
fileTypesItem = createInput("fileTypesEnabled",
8785
"Enable file type associations",
8886
"Register supported file extensions with the operating system",
8987
"File types always handled", "File type registration not supported",
90-
isFileExtensionsToggleable(), isFileExtensionsEnabled());
88+
desktopService.isFileExtensionsToggleable(),
89+
desktopService.isFileExtensionsEnabled());
9190
}
92-
93-
// Set module inputs to match current desktop integration values.
94-
setInputValue(webLinksItem, isWebLinksEnabled());
95-
setInputValue(desktopIconItem, isDesktopIconPresent());
96-
setInputValue(fileTypesItem, isFileExtensionsEnabled());
9791
}
9892

9993
@Override
10094
public void run() {
101-
desktopPlatforms().forEach(p -> {
102-
// Resolve each feature's desired state: use the checkbox value
103-
// if toggleable, otherwise preserve the current platform state.
104-
final boolean webLinks = p.isWebLinksToggleable()
105-
? Boolean.TRUE.equals(getInputValue(webLinksItem))
106-
: p.isWebLinksEnabled();
107-
final boolean desktopIcon = p.isDesktopIconToggleable()
108-
? Boolean.TRUE.equals(getInputValue(desktopIconItem))
109-
: p.isDesktopIconPresent();
110-
final boolean fileTypes = p.isFileExtensionsToggleable()
111-
? Boolean.TRUE.equals(getInputValue(fileTypesItem))
112-
: p.isFileExtensionsEnabled();
113-
try {
114-
p.syncDesktopIntegration(webLinks, desktopIcon, fileTypes);
115-
}
116-
catch (final IOException e) {
117-
if (log != null) log.error("Error performing desktop integration", e);
118-
}
119-
});
95+
final boolean webLinks = Boolean.TRUE.equals(getInputValue(webLinksItem));
96+
final boolean desktopIcon = Boolean.TRUE.equals(getInputValue(desktopIconItem));
97+
final boolean fileTypes = Boolean.TRUE.equals(getInputValue(fileTypesItem));
98+
desktopService.syncDesktopIntegration(webLinks, desktopIcon, fileTypes);
12099
super.run();
121100
}
122101

@@ -131,6 +110,7 @@ private MutableModuleItem<?> createInput(final String name,
131110
if (toggleable) {
132111
item = addInput(name, boolean.class);
133112
item.setLabel(label);
113+
setInput(name, enabled);
134114
}
135115
else {
136116
item = addInput(name, String.class);
@@ -145,43 +125,8 @@ private MutableModuleItem<?> createInput(final String name,
145125
return item;
146126
}
147127

148-
private void setInputValue(final ModuleItem<?> item, boolean value) {
149-
if (item.getType() != boolean.class) return;
150-
setInput(item.getName(), value);
151-
}
152-
153128
private Boolean getInputValue(final ModuleItem<?> item) {
154-
if (item.getType() != boolean.class) return null;
155-
return (Boolean) getInput(item.getName());
156-
}
157-
158-
private boolean isDesktopIconToggleable() {
159-
return desktopPlatforms().anyMatch(p -> p.isDesktopIconToggleable());
160-
}
161-
162-
private boolean isDesktopIconPresent() {
163-
return desktopPlatforms().allMatch(p -> p.isDesktopIconPresent());
164-
}
165-
166-
private boolean isWebLinksToggleable() {
167-
return desktopPlatforms().anyMatch(p -> p.isWebLinksToggleable());
168-
}
169-
170-
private boolean isWebLinksEnabled() {
171-
return desktopPlatforms().allMatch(p -> p.isWebLinksEnabled());
172-
}
173-
174-
private boolean isFileExtensionsToggleable() {
175-
return desktopPlatforms().anyMatch(p -> p.isFileExtensionsToggleable());
176-
}
177-
178-
private boolean isFileExtensionsEnabled() {
179-
return desktopPlatforms().allMatch(p -> p.isFileExtensionsEnabled());
180-
}
181-
182-
private Stream<DesktopIntegrationProvider> desktopPlatforms() {
183-
return platformService.getTargetPlatforms().stream() //
184-
.filter(p -> p instanceof DesktopIntegrationProvider) //
185-
.map(p -> (DesktopIntegrationProvider) p);
129+
return item.getType() == boolean.class ?
130+
(Boolean) getInput(item.getName()) : null;
186131
}
187132
}

0 commit comments

Comments
 (0)