Conversation
…tboundgateway always 1 member
|
May fail due to a weird case where the ClientSession doesnt properly get dependency injection, no clue why this suddenly happens |
There was a problem hiding this comment.
Pull request overview
This PR adds FrankFramework “gateway” connectivity (Hazelcast/local bus) to the Flow backend, introduces a session concept for selecting a cluster member + workspace isolation, and wires a new endpoint + UI polling to discover and display remote configurations.
Changes:
- Replace the removed
UserContextFilter/UserWorkspaceContextapproach with a session-scopedClientSession(workspace id + selected member target). - Add gateway-facing infrastructure (
FrankGateway,FrankFrameworkService,ResponseUtils) and expose framework configuration discovery via/api/projects/configurations+ frontend polling. - Add security chain config and docker-compose resources to run Flow + a FrankFramework instance in a Hazelcast cluster.
Reviewed changes
Copilot reviewed 31 out of 31 changed files in this pull request and generated 9 comments.
Show a summary per file
| File | Description |
|---|---|
| src/test/java/org/frankframework/flow/security/UserContextFilterTest.java | Removed tests for deleted JWT/session-based filter. |
| src/test/java/org/frankframework/flow/project/ProjectControllerTest.java | Removed mocks for deleted user-context filter/context. |
| src/test/java/org/frankframework/flow/git/GitControllerTest.java | Removed mocks for deleted user-context filter/context. |
| src/test/java/org/frankframework/flow/frankdoc/FrankDocControllerTest.java | Removed mocks for deleted user-context filter/context. |
| src/test/java/org/frankframework/flow/frankconfig/FrankConfigXsdControllerTest.java | Removed mocks for deleted user-context filter/context. |
| src/test/java/org/frankframework/flow/filesystem/CloudFileSystemStorageServiceTest.java | Updated tests to use ClientSession instead of UserWorkspaceContext; added helper methods. |
| src/test/java/org/frankframework/flow/configuration/ConfigurationControllerTest.java | Removed mocks for deleted user-context filter/context. |
| src/test/java/org/frankframework/flow/common/config/ClientSessionTest.java | New tests for ClientSession workspace-id hashing and member selection. |
| src/test/java/org/frankframework/flow/adapter/AdapterControllerTest.java | Removed mocks for deleted user-context filter/context. |
| src/main/resources/application.properties | Added logging config and toggles; disabled JMX and HTTP authentication by default. |
| src/main/java/org/frankframework/flow/utility/ResponseUtils.java | New helper to convert gateway/bus messages into Spring ResponseEntity/streaming responses. |
| src/main/java/org/frankframework/flow/security/UserWorkspaceContext.java | Deleted request-scoped workspace context. |
| src/main/java/org/frankframework/flow/security/UserContextFilter.java | Deleted filter that initialized workspace context from JWT/session headers. |
| src/main/java/org/frankframework/flow/project/ProjectController.java | Added gateway-backed /projects/configurations endpoint; injected FrankFrameworkService. |
| src/main/java/org/frankframework/flow/filesystem/CloudFileSystemStorageService.java | Switched from UserWorkspaceContext to ClientSession for per-user workspace root. |
| src/main/java/org/frankframework/flow/common/config/WebConfiguration.java | Added message converter registration attempt for InputStream payloads. |
| src/main/java/org/frankframework/flow/common/config/SecurityChainConfigurer.java | New Spring Security filter chain + authenticator wiring. |
| src/main/java/org/frankframework/flow/common/config/ClientSession.java | New session-scoped bean (workspace id + selected cluster member). |
| src/main/java/org/frankframework/flow/common/FrankGateway.java | New bean wiring for management bus channel, outbound gateway factory, JWT key generator. |
| src/main/java/org/frankframework/flow/common/FrankFrameworkService.java | New service to call gateway sync/async using the session’s selected member target. |
| src/main/java/org/frankframework/flow/common/ClusterMembers.java | New controller to expose cluster members and log member events. |
| src/main/java/org/frankframework/flow/common/AllowAllFrankUserRoles.java | New meta-annotation to centralize allowed Frank user roles. |
| src/main/java/org/frankframework/flow/FlowApplication.java | Minor formatting change. |
| src/main/frontend/app/services/frank-framework-service.ts | New frontend service to fetch instance configurations. |
| src/main/frontend/app/routes/projectlanding/project-landing.tsx | UI polling to discover remote configurations and render them on landing page. |
| pom.xml | Updated Spring Boot parent + Java version; added frankframework gateway/security + hazelcast deps. |
| flow-framework-compose.yml | New compose file to run Flow + FrankFramework with Hazelcast gateways. |
| docker/resources/resources.yml | New docker resources for ff-test instance (H2 datasource). |
| docker/resources/Configuration.xml | New sample Frank configuration for ff-test instance. |
| docker/Dockerfile | Updated runtime image to Java 25. |
| .run/Flow Hazelcast Cluster.run.xml | IDE run configuration for docker-compose cluster startup. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
Tests keep failing because of our nexus having migration quirks which prevents us from pulling FF modules as dependencies, I'll put this on hold till that is fixed |
|
|
@Matthbo Is this ready for review or do you want to change more things? |
It's ready for review |
stijnpotters1
left a comment
There was a problem hiding this comment.
Looks good!
But some question / feedback
| } | ||
|
|
||
| @AllowAllFrankUserRoles | ||
| @GetMapping(value = "/cluster/members", produces = MediaType.APPLICATION_JSON_VALUE) |
There was a problem hiding this comment.
Perhaps it is possible to put this value as @RequestMapping at the top of the class. Since this is the only endpoint, it is named after the class and this is applied in every other controller as well.
There was a problem hiding this comment.
Hm yes this originally was meant for more things that had to do with ClusterMembers but since its now mainly just a controller I can do that
| } | ||
|
|
||
| private UUID getMemberTarget() { | ||
| return session.getMemberTarget(); |
There was a problem hiding this comment.
This property in the ClientSession class already has a @Getter annotation before it.
Why making a seperate getter for this?
private @Getter UUID memberTarget;
There was a problem hiding this comment.
So ClientSession doesn't have to be injected into controllers that make use of this service just for this.
This is mostly just useful for the Console where this is taken from but it can't hurt to have it here too
| return response; | ||
| } | ||
|
|
||
| private record FFConfigurationDTO( |
There was a problem hiding this comment.
Perhaps put in a seperate file?
There was a problem hiding this comment.
Its only used in this class, would you still like me to make a separate class for it?


No description provided.