Skip to content, Skip to search

Changes

SciJava Common

8,211 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]].
See = Plugin framework = First and foremost, SciJava Common is a plugin framework—a base for developing highly modular and extensible Java applications. == 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 [source repository](https://github.com/jglick/sezpoz/ SezPoz] project. = Application container = All program state, such as available plugins, is accessible from a root object known as the ''application context''. == Services == {{ImageJ1| Whereas [[ImageJ1]] is a [[wikipedia: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 [[wikipedia: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 === Some of the services which ImageJ adds: * '''{{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/display | class = OverlayService}}''' -commonTools for creating and managing image overlays and regions of interest (ROIs). === SCIFIO services === SCIFIO provides several additional services—in particular: * '''{{Javadoc | project = SCIFIO | package = io/scif/services | class = FormatService}}''' - Service for managing available image formats. = Menuing system = The SciJava menuing system is divided into several layers, to make it easier to override its behavior or customize its appearance in a user interface. == 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 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 == The {{Javadoc | package = org/scijava/menu | class = MenuService}} takes care of constructing {{Javadoc | package = org/scijava/menu | class = ShadowMenu}} tree structures for all available modules in the system, using their <code>menuPath</code> and <code>menuRoot</code> values. These tree structures are UI-agnostic. There is one <code>ShadowMenu</code> per <code>menuRoot</code>, which can be requested at will from the <code>MenuService</code>. == User interfaces == The {{Javadoc | package = org/scijava/ui | class = UIService}} then takes care of constructing an actual UI-specific menu bar (or whatever UI components and/or widgets it wants) from the available <code>ShadowMenu</code>s. There is a type hierarchy beneath the {{Javadoc | package = org/scijava/menu | class = MenuCreator}} interface intended for this purpose; for more informationexample, the {{Javadoc | package = org/scijava/ui/swing/menu | class = SwingJMenuBarCreator}} implements <code>MenuCreator</code> to create and maintain a Swing {{Javadoc | project = Java | package = javax/swing | class = JMenuBar}} that reflects the state of a particular <code>ShadowMenu</code>. == How changes propagate == 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://scijava.org/ SciJava web site]* [http://scijava.org/scijava-common/scijava-common.html SciJava Common presentation]* {{GitHub|org=imagej|repo=tutorials|label=ImageJ tutorials}}* {{GitHub|org=scijava|repo=scijava-common|label=SciJava Common source code}}
Bureaucrat, emailconfirmed, incoming, administrator, uploaders
706
edits