Context
Hop Web already renders pipelines and workflows by generating SVG on the server (PipelineCanvasSvgRenderer / WorkflowCanvasSvgRenderer), caching a revisioned snapshot, serving it via the canvasRender service handler, and overlaying it in the browser (canvas-svg.js). Clicks stay on the RAP SWT path with server-side AreaOwner hit testing; hover uses CanvasInteractionHandler.
That stack is hard-wired to pipeline and workflow graphs:
CanvasSvgFacade only exposes renderPipeline / renderWorkflow
CanvasSvgFacadeImpl.syncAreaOwnersToGraph only knows HopGuiPipelineGraph / HopGuiWorkflowGraph
CanvasInteractionHandler.handleHover same hard-coding
CanvasFacadeImpl.setDataInternal treats any non-WorkflowMeta as PipelineMeta (ClassCastException for custom models)
Plugins that ship custom canvas editors (e.g. Data Vault / Business Vault / dimensional modelers, other graph file types) cannot reuse the existing Hop Web SVG transport without forking RAP code.
Related consumer: mattcasters/hop-data-vault#119
Goal (minimal for 2.19.0 feature freeze)
Expose a small, backward-compatible SPI so any registered graph can:
- Publish a pre-rendered
CanvasSvgRenderResult snapshot (SVG + area owners + view/graph ports)
- Receive hover events and area-owner updates without being a pipeline/workflow graph
- Call
CanvasFacade.setData with non-pipeline/workflow meta without crashing (common props only)
Pipeline/workflow behavior must remain unchanged.
Proposed API (minimal)
IWebCanvasGraph (ui module)
public interface IWebCanvasGraph {
void replaceAreaOwners(List<AreaOwner> owners);
void handleWebCanvasHover(int graphX, int graphY, int screenX, int screenY);
}
- Implement on existing
HopGuiPipelineGraph / HopGuiWorkflowGraph (methods already exist)
- RAP hover + area sync use
instanceof IWebCanvasGraph
CanvasSvgFacade.publishSnapshot(...)
public static void publishSnapshot(
Canvas canvas,
CanvasSvgRenderResult result,
float magnification,
DPoint offset,
Point canvasSize);
- Extract existing private snapshot store path used by pipeline/workflow render
- Plugins render with their own painters +
SvgGc, then publish
CanvasFacadeImpl guard
- If meta is neither
PipelineMeta nor WorkflowMeta, set common props (theme, grid, mag, offset, viewport) only; do not cast to PipelineMeta
Non-goals for this PR
- Plugin-shipped JavaScript / custom RAP remote types
- Rewriting modelers inside Hop core
- Changing client
canvas-svg.js interaction model
Acceptance
Why 2.19.0
Needed before feature freeze so external plugins (Data Vault and others) can wire Hop Web modelers against the 2.19 line without waiting for 2.20.
Context
Hop Web already renders pipelines and workflows by generating SVG on the server (
PipelineCanvasSvgRenderer/WorkflowCanvasSvgRenderer), caching a revisioned snapshot, serving it via thecanvasRenderservice handler, and overlaying it in the browser (canvas-svg.js). Clicks stay on the RAP SWT path with server-sideAreaOwnerhit testing; hover usesCanvasInteractionHandler.That stack is hard-wired to pipeline and workflow graphs:
CanvasSvgFacadeonly exposesrenderPipeline/renderWorkflowCanvasSvgFacadeImpl.syncAreaOwnersToGraphonly knowsHopGuiPipelineGraph/HopGuiWorkflowGraphCanvasInteractionHandler.handleHoversame hard-codingCanvasFacadeImpl.setDataInternaltreats any non-WorkflowMetaasPipelineMeta(ClassCastException for custom models)Plugins that ship custom canvas editors (e.g. Data Vault / Business Vault / dimensional modelers, other graph file types) cannot reuse the existing Hop Web SVG transport without forking RAP code.
Related consumer: mattcasters/hop-data-vault#119
Goal (minimal for 2.19.0 feature freeze)
Expose a small, backward-compatible SPI so any registered graph can:
CanvasSvgRenderResultsnapshot (SVG + area owners + view/graph ports)CanvasFacade.setDatawith non-pipeline/workflow meta without crashing (common props only)Pipeline/workflow behavior must remain unchanged.
Proposed API (minimal)
IWebCanvasGraph(ui module)HopGuiPipelineGraph/HopGuiWorkflowGraph(methods already exist)instanceof IWebCanvasGraphCanvasSvgFacade.publishSnapshot(...)SvgGc, then publishCanvasFacadeImplguardPipelineMetanorWorkflowMeta, set common props (theme, grid, mag, offset, viewport) only; do not cast toPipelineMetaNon-goals for this PR
canvas-svg.jsinteraction modelAcceptance
CanvasFacade.setData(canvas, mag, offset, customModel)does not ClassCast under RAPIWebCanvasGraphcanregisterCanvas+publishSnapshotand appear in Hop Web via existing client overlayWhy 2.19.0
Needed before feature freeze so external plugins (Data Vault and others) can wire Hop Web modelers against the 2.19 line without waiting for 2.20.