Skip to content

Commit aa612e3

Browse files
committed
Make AppService lazily initialized with singletons
This converts the AppService to a SingletonService, and also removes its overridden initialize() implementation in favor of a lazy initialization pattern.
1 parent 0f9a9b6 commit aa612e3

File tree

3 files changed

+24
-24
lines changed

3 files changed

+24
-24
lines changed

src/main/java/org/scijava/app/App.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
import org.scijava.plugin.Plugin;
3535
import org.scijava.plugin.RichPlugin;
36+
import org.scijava.plugin.SingletonPlugin;
3637
import org.scijava.util.Manifest;
3738
import org.scijava.util.POM;
3839

@@ -50,7 +51,7 @@
5051
* @see Plugin
5152
* @see AppService
5253
*/
53-
public interface App extends RichPlugin {
54+
public interface App extends RichPlugin, SingletonPlugin {
5455

5556
/** Gets the title of the application. */
5657
String getTitle();

src/main/java/org/scijava/app/AppService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,14 @@
3333

3434
import java.util.Map;
3535

36-
import org.scijava.service.SciJavaService;
36+
import org.scijava.plugin.SingletonService;
3737

3838
/**
3939
* Interface for application-level functionality.
4040
*
4141
* @author Curtis Rueden
4242
*/
43-
public interface AppService extends SciJavaService {
43+
public interface AppService extends SingletonService<App> {
4444

4545
/** Gets an application by name. */
4646
App getApp(final String name);

src/main/java/org/scijava/app/DefaultAppService.java

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,15 +33,13 @@
3333

3434
import java.util.Collections;
3535
import java.util.HashMap;
36-
import java.util.List;
3736
import java.util.Map;
3837

3938
import org.scijava.log.LogService;
39+
import org.scijava.plugin.AbstractSingletonService;
4040
import org.scijava.plugin.Parameter;
4141
import org.scijava.plugin.Plugin;
42-
import org.scijava.plugin.PluginInfo;
4342
import org.scijava.plugin.PluginService;
44-
import org.scijava.service.AbstractService;
4543
import org.scijava.service.Service;
4644

4745
/**
@@ -50,7 +48,7 @@
5048
* @author Curtis Rueden
5149
*/
5250
@Plugin(type = Service.class)
53-
public class DefaultAppService extends AbstractService implements AppService {
51+
public class DefaultAppService extends AbstractSingletonService<App> implements AppService {
5452

5553
@Parameter
5654
private LogService log;
@@ -65,41 +63,42 @@ public class DefaultAppService extends AbstractService implements AppService {
6563

6664
@Override
6765
public App getApp(final String name) {
68-
return apps.get(name);
66+
return apps().get(name);
6967
}
7068

7169
@Override
7270
public Map<String, App> getApps() {
73-
return apps;
71+
return apps();
7472
}
7573

76-
// -- Service methods --
74+
// -- SingletonService methods --
7775

7876
@Override
79-
public void initialize() {
80-
apps = Collections.unmodifiableMap(discoverApps());
81-
log.info("Found " + apps.size() + " applications.");
82-
super.initialize();
77+
public Class<App> getPluginType() {
78+
return App.class;
8379
}
8480

85-
// -- Helper methods --
81+
// -- Helper methods - lazy initialization --
82+
83+
/** Gets {@link #apps}, initializing if necessary. */
84+
private Map<String, App> apps() {
85+
if (apps == null) initApps();
86+
return apps;
87+
}
8688

87-
/** Discovers applications. */
88-
private HashMap<String, App> discoverApps() {
89+
/** Initializes {@link #apps}. */
90+
private synchronized void initApps() {
91+
if (apps != null) return; // already initialized
8992
final HashMap<String, App> map = new HashMap<String, App>();
9093

91-
final List<PluginInfo<App>> infos =
92-
pluginService.getPluginsOfType(App.class);
93-
for (final PluginInfo<App> info : infos) {
94-
final App app = pluginService.createInstance(info);
95-
if (app == null) continue;
96-
final String name = info.getName();
94+
for (final App app : getInstances()) {
95+
final String name = app.getInfo().getName();
9796
if (!map.containsKey(name)) {
9897
// no (higher-priority) app with the same name exists
9998
map.put(name, app);
10099
}
101100
}
102-
return map;
101+
apps = Collections.unmodifiableMap(map);
103102
}
104103

105104
}

0 commit comments

Comments
 (0)