Java classes for model graph operations ======================================= This description of the roles played by server-side Java classes assumes familiarity with the :doc:`ObjectGraphs` machinery of OMERO.server. Navigating the graph -------------------- When OMERO.server starts up the :javadoc_server:`GraphPathBean <ome/services/graphs/GraphPathBean.html>` reflects upon the object model and collates information about classes, subclasses, properties and their value types. This is what :javadoc_server:`GraphPathReport <ome/services/graphs/GraphPathReport.html>` uses to generate the :doc:`../Model/EveryObject`. Traversing and acting --------------------- OMERO.server's :javadoc_server:`GraphTraversal <ome/services/graphs/GraphTraversal.html>` is at the core of all graph operations, * querying the database to establish the model graph, with the help of ``GraphPathBean`` * applying the graph operation's policy rules and changing the graph node states * acting on the model objects according to the final state of the graph. ``GraphTraversal``'s :javadoc_server:`Processor <ome/services/graphs/GraphTraversal.Processor.html>` interface is implemented by specific graph requests to act on the selected model objects. ``GraphTraversal`` implements its :javadoc_server:`PlanExecutor <ome/services/graphs/GraphTraversal.PlanExecutor.html>` interface with code that calls those ``Processor`` methods: it provides that ``PlanExecutor`` implementation back to requests so that they can control exactly if or when to act via their ``Processor`` implementation. :javadoc_server:`ModelObjectSequencer <ome/services/graphs/ModelObjectSequencer.html>` ensures that objects are acted upon in the proper order. For example, in deleting ``OriginalFile`` instances, a directory's contents are deleted before their containing directory is deleted. In OMERO.blitz, :javadoc_blitz:`BaseGraphTraversalProcessor <omero/cmd/graphs/BaseGraphTraversalProcessor.html>` offers a useful base class for implementing ``Processor`` and :javadoc_blitz:`NullGraphTraversalProcessor <omero/cmd/graphs/NullGraphTraversalProcessor.html>` has no effects at all. Several graph requests define their own ``InternalProcessor`` class. Policy rules for node transitions --------------------------------- ``GraphTraversal`` manages the traversal of the model graph but it is instances of OMERO.server's :javadoc_server:`GraphPolicy <ome/services/graphs/GraphPolicy.html>` that decide how the graph's nodes are to change state during traversal. The class is instantiated by the static ``parseRules`` method of :javadoc_server:`GraphPolicyRule <ome/services/graphs/GraphPolicyRule.html>` which provides a ``GraphPolicy`` based on parsing a sequence of ``GraphPolicyRule`` instances. Each of those rules describes in textual form how it matches graph fragments and what to do in the event of a match. OMERO.blitz's :javadoc_blitz:`BaseGraphPolicyAdjuster <omero/cmd/graphs/BaseGraphPolicyAdjuster.html>` provides convenient hooks for adjusting how an existing ``GraphPolicy`` transitions nodes. Classes that do such adjustment include, :javadoc_blitz:`ChildOptionsPolicy <omero/cmd/graphs/ChildOptionsPolicy.html>` marks certain nodes as ``IS_LAST`` or ``IS_NOT_LAST`` once they are ``RELEVANT`` :javadoc_blitz:`SkipHeadPolicy <omero/cmd/graphs/SkipHeadPolicy.html>` #. in skipping the head, prevents traversal beyond certain node types #. in processing the remaining graph, preserves permissions overrides established in the first phase :javadoc_blitz:`SkipTailPolicy <omero/cmd/graphs/SkipTailPolicy.html>` prevents traversal beyond certain node types OMERO.server provides the :javadoc_server:`GraphPolicyRulePredicate <ome/services/graphs/GraphPolicyRulePredicate.html>` interface which is used for the ``;`` suffix notation in rule matches. For example, :javadoc_server:`GroupPredicate <ome/services/graphs/GroupPredicate.html>` can match ``group=system`` and :javadoc_server:`PermissionsPredicate <ome/services/graphs/PermissionsPredicate.html>` can match ``perms=r?ra??``. OMERO.blitz graph requests -------------------------- The :doc:`GraphRequests` of OMERO.blitz benefit from helper classes. :javadoc_blitz:`GraphRequestFactory <omero/cmd/graphs/GraphRequestFactory.html>` instantiates the graph request implementations and provides them means to create a context-aware :javadoc_blitz:`GraphHelper <omero/cmd/graphs/GraphHelper.html>`. This helper includes the code that is common to many of the graph requests. Helper methods not requiring any context are instead collected in the stateless :javadoc_blitz:`GraphUtil <omero/cmd/graphs/GraphUtil.html>`.