Skip to content, Skip to search

Changes

SciJava Common

559 bytes added, 10:08, 3 December 2018
Add link to API version history
{{ComponentStats:org.scijava:scijava-common}}SciJava Common is a common library for [[SciJava]] software. It provides a plugin framework, with an extensible mechanism for service discovery, backed by its own annotation processor, so that plugins can be loaded dynamically. It is used by both [[ImageJ]] and [[SCIFIO]].
= Plugin framework =
== Plugin discovery ==
All plugins available on Java's classpath are automatically discovered and made available. This is accomplished by scanning classpath resources for the file path <code>META-INF/json/org.scijava.plugin.Plugin</code>. Such files are generated at compile time by a Java annotation processor that writes them in response to <code>@Plugin</code> annotations on Java classes, an idea inspired by the [https://github.com/jglick/sezpoz.java.net/ SezPoz] project.
= Application container =
== Services ==
{{Sidebox | title = Comparison with ImageJ 1.xImageJ1| text = Whereas [[ImageJ1]] is a [https[wikipedia://en.wikipedia.org/wiki/Singleton_pattern Singleton pattern|singleton]], with static methods to access much of its functionality, [[ImageJ2]] encapsulates its program state in the application context, allowing multiple simultaneous such contexts in the same JVM.}}ImageJ encapsulates its various parts as separate "services" that provide related state functionality and track related program state. An instance of the {{Javadoc | package = net/imagej | class = ImageJ}} class is nothing more than a collection of these services; this instance is referred to as the "application gateway." Services are defined as interfaces, with concrete implementations as plugins. This design provides [http://c2.com/cgi/wiki?SoftwareSeam seams] in the right places so that behavior at every level can be customized and overridden.
=== SciJava services ===
Here are a few of SciJava Common's major core services:
* '''{{Javadoc | project = SciJava | package = org/scijava/app | class = AppService}}''' - Tracks software applications (SCIFIO, ImageJ, etc.) present in the context.* '''{{Javadoc | project = SciJava | package = org/scijava/display | class = DisplayService}}''' - Tracks available displays, as well as the active display, and provides the means to create new displays to visualize data.* '''{{Javadoc | project = SciJava | package = org/scijava/event | class = EventService}}''' - Publishes events to the [http[wikipedia://eventbus.org/ Publish%E2%80%93subscribe pattern|event bus]], and allows interested parties to subscribe to them. The service provides the central means of communication between various parts of the codebase.* '''{{Javadoc | project = SciJava | package = org/scijava/io | class = IOService}}''' - General tools for opening and saving data within the context.* '''{{Javadoc | project = SciJava | package = org/scijava/menu | class = MenuService}}''' - Builds the application menu structure.* '''{{Javadoc | project = SciJava | package = org/scijava/module | class = ModuleService}}''' - Tracks available modules, and provides the infrastructure for executing them.* '''{{Javadoc | project = SciJava | package = org/scijava/object | class = ObjectService}}''' - Tracks available objects of various types, including {{Javadoc | package = net/imagej | class = Dataset}}s and {{Javadoc | package = org/scijava/display | class = Display}}s.* '''{{Javadoc | project = SciJava | package = org/scijava/options | class = OptionsService}}''' - Tools for managing program settings.* '''{{Javadoc | project = SciJava | package = org/scijava/platform | class = PlatformService}}''' - Provides hooks for extending the application's behavior depending on the deployment platform (operating system, version of Java, etc.).* '''{{Javadoc | project = SciJava | package = org/scijava/plugin | class = PluginService}}''' - Tracks available plugins, and provides the infrastructure for executing them (using the {{Javadoc | package = org/scijava/module | class = ModuleService}}).* '''{{Javadoc | project = SciJava | package = org/scijava/script | class = ScriptService}}''' - Provides utilities for running scripts and macros.* '''{{Javadoc | project = SciJava | package = org/scijava/app | class = StatusService}}''' - Publishes status updates for ongoing operations.* '''{{Javadoc | project = SciJava | package = org/scijava/thread | class = ThreadService}}''' - Manages multithreading.* '''{{Javadoc | project = SciJava | package = org/scijava/tool | class = ToolService}}''' - Tracks available tools—logic binding user input to behavior—as well as the active tool (selected on the toolbar).* '''{{Javadoc | project = SciJava | package = org/scijava/ui | class = UIService}}''' - Discovers and launches a user interface for interacting with ImageJ.
=== ImageJ services ===
* '''{{Javadoc | package = net/imagej | class = DatasetService}}''' - Tools for creating and managing image data.
* '''{{Javadoc | package = net/imagej/display | class = ImageDisplayService}}''' - Similar to {{Javadoc | package = org/scijava/display | class = DisplayService}}, but specifically for {{Javadoc | package = net/imagej/display | class = ImageDisplay}}s.
* '''{{Javadoc | package = net/imagej/overlay display | class = OverlayService}}''' - Tools for creating and managing image overlays and regions of interest (ROIs).
=== SCIFIO services ===
== Modules ==
Each module known to the system (via the {{Javadoc | package = org/scijava/module | class = ModuleService}} can have a <code>menuPath</code> that says where it should live (by default) in the menu. It is also has a <code>menuRoot</code> that says in ''which'' menu it should live, with the default being the <code>APPLICATION_MENU_ROOT</code>, indicating the main application menu structure.
== MenuService ==
When modules are added, removed or changed (via {{Javadoc | package = org/scijava/module/event | class = ModulesAddedEvent}}, {{Javadoc | package = org/scijava/module/event | class = ModulesRemovedEvent}}, {{Javadoc | package = org/scijava/module/event | class = ModulesUpdatedEvent}}), the <code>MenuService</code> listens and updates the associated <code>ShadowMenu</code>(s) accordingly. It notifies interested parties that it has done so by firing a corresponding event: {{Javadoc | package = org/scijava/menu/event | class = MenusAddedEvent}}, {{Javadoc | package = org/scijava/menu/event | class = MenusRemovedEvent}}, or {{Javadoc | package = org/scijava/menu/event | class = MenusUpdatedEvent}}.
 
= API Version History =
 
A history of API changes is available at:
https://abi-laboratory.pro/java/tracker/timeline/scijava-common/
= Further reading =
* [http://www.scijava.org/ SciJava web site]* [http://www.scijava.org/scijava-common/scijava-common.html SciJava Common presentation]* {{GitHub|org=imagej|repo=imagej-tutorials|label=ImageJ tutorials}}
* {{GitHub|org=scijava|repo=scijava-common|label=SciJava Common source code}}
Bureaucrat, emailconfirmed, incoming, administrator, uploaders
706
edits