Skip to content

Refactor controller injection and add event publisher#449

Merged
DropSnorz merged 1 commit intomasterfrom
chore/refactor-controller-di
Mar 23, 2026
Merged

Refactor controller injection and add event publisher#449
DropSnorz merged 1 commit intomasterfrom
chore/refactor-controller-di

Conversation

@DropSnorz
Copy link
Copy Markdown
Owner

Relates to #437

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 15, 2026

Walkthrough

Refactors controller-to-controller calls into a Spring event-driven model, adds lightweight event types, centralizes JavaFX thread scheduling via a new FX utility, relocates ListDirectoryDialogController to core, and replaces direct UI refreshes with published events and event listeners.

Changes

Cohort / File(s) Summary
Event types
owlplug-client/src/main/java/com/owlplug/auth/events/AccountUpdateEvent.java, .../core/events/PreferencesChangedEvent.java, .../explore/events/RemoteSourceUpdatedEvent.java, .../plugin/events/PluginRefreshEvent.java, .../plugin/events/PluginUpdateEvent.java
Added five lightweight event record/class types used for decoupled notifications.
FX thread helper
owlplug-client/src/main/java/com/owlplug/core/utils/FX.java
New final utility with run(...) and runAsync(...) to centralize JavaFX-thread execution; replaces many direct Platform.runLater calls.
Event publishing — auth & accounts
owlplug-client/src/main/java/com/owlplug/auth/controllers/AccountController.java, .../auth/services/AuthenticationService.java
Removed direct MainController coupling; AuthenticationService now publishes AccountUpdateEvent; AccountController no longer calls MainController.refreshAccounts.
Main / options / dialogs — listen & publish
owlplug-client/src/main/java/com/owlplug/core/controllers/MainController.java, .../OptionsController.java, .../dialogs/CrashRecoveryDialogController.java, .../WelcomeDialogController.java
Injected ApplicationEventPublisher and @EventListener handlers; publish PreferencesChangedEvent on preference/state changes and use FX.run(...) in listeners.
Dialog & component wiring
owlplug-client/src/main/java/com/owlplug/core/components/DialogManager.java, .../core/components/TaskRunner.java
DialogManager uses external StackPane container (setter) instead of MainController; TaskRunner switched to FX.run(...) and lazily injects TaskBarController.
Explore/source flow
owlplug-client/src/main/java/com/owlplug/explore/services/ExploreService.java, .../explore/controllers/ExploreController.java, .../explore/controllers/SourceMenuController.java, .../explore/controllers/NewSourceDialogController.java, .../explore/controllers/PackageInfoController.java
Removed direct sync/task coupling; ExploreService publishes RemoteSourceUpdatedEvent after saves/enable; controllers listen and invoke UI updates via FX.run(...); some methods became synchronized or had refreshView removed.
Plugin system eventing
owlplug-client/src/main/java/com/owlplug/plugin/services/PluginService.java, .../plugin/controllers/PluginInfoController.java, .../plugin/controllers/PluginsController.java, .../plugin/controllers/PluginTableController.java, .../plugin/controllers/dialogs/DisablePluginDialogController.java, .../plugin/components/PluginTaskFactory.java
PluginService publishes PluginRefreshEvent/PluginUpdateEvent after mutations; controllers replaced direct refresh calls with event listeners and FX.run(...); several injections marked @Lazy.
Project & explore UI refs / repackage
owlplug-client/src/main/java/com/owlplug/core/controllers/dialogs/ListDirectoryDialogController.java, owlplug-client/src/main/java/com/owlplug/core/controllers/fragments/PluginPathFragmentController.java, owlplug-client/src/main/java/com/owlplug/project/controllers/ProjectsController.java, .../fxml/dialogs/ListDirectoryView.fxml
Moved ListDirectoryDialogController from plugin package into core and updated all references and FXML controller binding.
FXML resource path updates
owlplug-client/src/main/resources/fxml/MainView.fxml, .../explore/ExploreView.fxml, .../plugins/*.fxml, .../projects/*.fxml
Adjusted fx:include sources and changed many icon/Image relative paths (../icons/../../icons/) to match reorganized FXML layout.
Minor cleanup & config
multiple small files: .../core/services/AppUpdateService.java, .../core/services/BaseService.java, .../core/services/OptionsService.java, .../core/services/TelemetryService.java, .../plugin/services/NativeHostService.java, .../project/services/PluginLookupService.java, .../project/controllers/ProjectInfoController.java, src/main/resources/application.properties
Whitespace tidy, removal of some telemetry fields, added @Lazy to several injections, and changed spring.main.allow-circular-references from true→false.

Sequence Diagram(s)

sequenceDiagram
    participant Service as Service/Controller
    participant AEP as ApplicationEventPublisher
    participant Listener as EventListener
    participant FX as FX.run()
    participant UI as UI Component

    Service->>AEP: publishEvent(new Event(...))
    AEP->>Listener: invoke `@EventListener` method
    Listener->>FX: FX.run(task)
    FX->>FX: if (on FX Thread) else schedule via Platform.runLater()
    FX->>UI: execute task to update UI
    UI->>UI: refresh/update view/state
Loading

Estimated Code Review Effort

🎯 4 (Complex) | ⏱️ ~65 minutes

Possibly Related PRs

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 34.69% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed The PR title accurately describes the main refactoring work: replacing direct controller dependencies with Spring ApplicationEventPublisher and event-driven architecture.
Description check ✅ Passed The description references issue #437 and relates to the changeset, though minimal detail is provided about the specific changes.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/refactor-controller-di

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@DropSnorz
Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 15, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
owlplug-client/src/main/java/com/owlplug/auth/services/AuthenticationService.java (1)

153-159: ⚠️ Potential issue | 🟠 Major

Publish AccountUpdateEvent after transaction commit.

Event at line 158 is fired inside a @Transactional method with a listener that refreshes account data. Default @EventListener can execute before transaction commit, causing the UI to observe stale state. Ensure event delivery is synchronized with transaction completion using TransactionSynchronizationManager or by switching the listener to @TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT). Line 119 has the same pattern.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@owlplug-client/src/main/java/com/owlplug/auth/services/AuthenticationService.java`
around lines 153 - 159, The AccountUpdateEvent is being published inside the
transactional method deleteAccount (and similarly in the other transactional
method around line 119), which may notify listeners before the transaction
commits; change the publish to occur after commit by either: (a) registering a
synchronization via
TransactionSynchronizationManager.registerSynchronization(...) inside
deleteAccount to publish the AccountUpdateEvent in afterCommit(), or (b) leave
the publishEvent call as-is but update the listener to use
`@TransactionalEventListener`(phase = TransactionPhase.AFTER_COMMIT); reference
the deleteAccount method and the AccountUpdateEvent and pick one approach to
ensure delivery occurs only after transaction commit.
🧹 Nitpick comments (2)
owlplug-client/src/main/java/com/owlplug/core/events/PreferencesChangedEvent.java (1)

21-22: Consider using a record for consistency with other event types.

RemoteSourceUpdatedEvent in this PR uses a record. For consistency across the event types, consider converting this to a record as well. If specific preference context becomes useful later, you could add an optional field.

♻️ Suggested refactor
-public class PreferencesChangedEvent {
-}
+public record PreferencesChangedEvent() {
+}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@owlplug-client/src/main/java/com/owlplug/core/events/PreferencesChangedEvent.java`
around lines 21 - 22, PreferencesChangedEvent is currently an empty class but
other event types (e.g., RemoteSourceUpdatedEvent) are records; convert
PreferencesChangedEvent to a record named PreferencesChangedEvent to match the
style and make it concise, optionally adding a field like Map<String,Object>
preferences or Optional<Preferences> if you want to carry context later; update
any places that instantiate or reference the class to use the record constructor
and accessors.
owlplug-client/src/main/java/com/owlplug/core/controllers/MainController.java (1)

190-191: Publish PreferencesChangedEvent only on an actual state change.

Lines 190-191 currently broadcast on every startup, even when FIRST_LAUNCH_KEY is already false, which causes unnecessary refresh fan-out.

💡 Proposed refactor
-    this.getPreferences().putBoolean(ApplicationDefaults.FIRST_LAUNCH_KEY, false);
-    publisher.publishEvent(new PreferencesChangedEvent());
+    boolean firstLaunch = this.getPreferences().getBoolean(ApplicationDefaults.FIRST_LAUNCH_KEY, true);
+    if (firstLaunch) {
+      this.getPreferences().putBoolean(ApplicationDefaults.FIRST_LAUNCH_KEY, false);
+      publisher.publishEvent(new PreferencesChangedEvent());
+    }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@owlplug-client/src/main/java/com/owlplug/core/controllers/MainController.java`
around lines 190 - 191, Currently the code unconditionally sets FIRST_LAUNCH_KEY
to false and always calls publisher.publishEvent(new PreferencesChangedEvent()),
causing spurious events; modify MainController so you first read the current
value via this.getPreferences().getBoolean(ApplicationDefaults.FIRST_LAUNCH_KEY,
true), compare it to the intended false state, only call
this.getPreferences().putBoolean(ApplicationDefaults.FIRST_LAUNCH_KEY, false)
and publisher.publishEvent(new PreferencesChangedEvent()) when the previous
value was true (i.e., an actual change occurred), thus avoiding emitting
PreferencesChangedEvent when no state change happened.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@owlplug-client/src/main/java/com/owlplug/core/components/TaskRunner.java`:
- Around line 200-202: In TaskRunner.registerTaskBarController, add fail-fast
validation: check the incoming tbc is not null and throw an
IllegalArgumentException (or NullPointerException) if it is, and prevent
accidental rebinding by throwing an IllegalStateException when
this.taskBarController is already set to a different instance; only assign tbc
to taskBarController after these checks (referencing registerTaskBarController,
TaskRunner, and taskBarController).

In
`@owlplug-client/src/main/java/com/owlplug/core/controllers/dialogs/WelcomeDialogController.java`:
- Around line 129-132: The PreferencesChangedEvent listener
handle(PreferencesChangedEvent) may call refreshView() before initialize() sets
up fragment controllers, causing NPEs; add a guard (e.g., a private boolean
initialized flag set to true at the end of initialize() or check that the
fragment controller fields used by refreshView are non-null) and change
handle(...) to only call FX.run(this::refreshView) when initialized is true (or
when those fragment controller fields are non-null) so the event-driven refresh
is skipped until the controller is fully initialized.

In
`@owlplug-client/src/main/java/com/owlplug/explore/controllers/ExploreController.java`:
- Around line 412-415: The handler handle(RemoteSourceUpdatedEvent) currently
calls FX.run(this::refreshView) directly and can start overlapping searches; fix
this by debouncing/coalescing events: introduce a single-thread
ScheduledExecutorService (e.g., scheduledExecutor) and a field
ScheduledFuture<?> pendingRefresh, and in handle(...) cancel pendingRefresh if
non-null then schedule a single task (with short delay, e.g., 100-300ms) that
invokes FX.run(this::refreshView); this ensures bursty RemoteSourceUpdatedEvent
events are coalesced into one refresh and prevents concurrent refreshView
executions.

In
`@owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginsController.java`:
- Around line 242-245: handle(...) currently calls displayPlugins() on the FX
thread, but displayPlugins() invokes pluginRepository.findAll() which will block
rendering; change handle(PluginUpdateEvent) to kick off a background fetch
(e.g., CompletableFuture.supplyAsync or an Executor) that calls
pluginRepository.findAll(), then on completion call FX.run(...) to pass the
resulting list to a UI-only method (rename or overload displayPlugins to accept
the fetched List or add updatePluginsUI(List) that only updates controls).
Ensure no direct calls to pluginRepository.findAll() occur inside FX.run and
keep all DB/IO on the background thread and all UI mutation inside FX.run.

In
`@owlplug-client/src/main/java/com/owlplug/plugin/events/PluginRefreshEvent.java`:
- Line 22: Fix the Javadoc grammar typo in the class comment for
PluginRefreshEvent: change the phrase "Plugin data as been updated in database."
to "Plugin data has been updated in database." by editing the Javadoc above the
PluginRefreshEvent class (ensure the corrected text appears in the Javadoc block
for the PluginRefreshEvent class or its file-level comment).

In
`@owlplug-client/src/main/java/com/owlplug/plugin/events/PluginUpdateEvent.java`:
- Around line 21-25: Fix the Javadoc typo in PluginUpdateEvent by changing "as
been" to "has been" and convert the empty class PluginUpdateEvent into a record
(e.g., public record PluginUpdateEvent(...) {}) to match the style used by
RemoteSourceUpdatedEvent; ensure any fields, constructors, or methods required
for event payload are moved into the record declaration and update usages to the
record's canonical constructor/accessors (refer to PluginUpdateEvent and
RemoteSourceUpdatedEvent to mirror field names and API).

In `@owlplug-client/src/main/resources/application.properties`:
- Line 19: Project fails startup due to unresolved circular dependency:
ProjectInfoController and SourceMenuController still inject MainController
directly (unlike ExploreController which uses `@Lazy`), causing
BeanCurrentlyInCreationException with circular references disabled; fix by
either annotating the MainController injection points in ProjectInfoController
and SourceMenuController with `@Lazy` to break the cycle (i.e., add `@Lazy` on the
field/constructor parameter where MainController is referenced), or complete the
refactor by removing direct MainController injections from ProjectInfoController
and SourceMenuController and replace them with application event
listeners/publishers so MainController is not directly referenced (ensure
listener methods are annotated with `@EventListener` and events are published via
ApplicationEventPublisher).

---

Outside diff comments:
In
`@owlplug-client/src/main/java/com/owlplug/auth/services/AuthenticationService.java`:
- Around line 153-159: The AccountUpdateEvent is being published inside the
transactional method deleteAccount (and similarly in the other transactional
method around line 119), which may notify listeners before the transaction
commits; change the publish to occur after commit by either: (a) registering a
synchronization via
TransactionSynchronizationManager.registerSynchronization(...) inside
deleteAccount to publish the AccountUpdateEvent in afterCommit(), or (b) leave
the publishEvent call as-is but update the listener to use
`@TransactionalEventListener`(phase = TransactionPhase.AFTER_COMMIT); reference
the deleteAccount method and the AccountUpdateEvent and pick one approach to
ensure delivery occurs only after transaction commit.

---

Nitpick comments:
In
`@owlplug-client/src/main/java/com/owlplug/core/controllers/MainController.java`:
- Around line 190-191: Currently the code unconditionally sets FIRST_LAUNCH_KEY
to false and always calls publisher.publishEvent(new PreferencesChangedEvent()),
causing spurious events; modify MainController so you first read the current
value via this.getPreferences().getBoolean(ApplicationDefaults.FIRST_LAUNCH_KEY,
true), compare it to the intended false state, only call
this.getPreferences().putBoolean(ApplicationDefaults.FIRST_LAUNCH_KEY, false)
and publisher.publishEvent(new PreferencesChangedEvent()) when the previous
value was true (i.e., an actual change occurred), thus avoiding emitting
PreferencesChangedEvent when no state change happened.

In
`@owlplug-client/src/main/java/com/owlplug/core/events/PreferencesChangedEvent.java`:
- Around line 21-22: PreferencesChangedEvent is currently an empty class but
other event types (e.g., RemoteSourceUpdatedEvent) are records; convert
PreferencesChangedEvent to a record named PreferencesChangedEvent to match the
style and make it concise, optionally adding a field like Map<String,Object>
preferences or Optional<Preferences> if you want to carry context later; update
any places that instantiate or reference the class to use the record constructor
and accessors.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 5df13902-fc12-4442-9ae0-60388136ccc8

📥 Commits

Reviewing files that changed from the base of the PR and between fa308f3 and d123793.

📒 Files selected for processing (50)
  • owlplug-client/src/main/java/com/owlplug/OwlPlug.java
  • owlplug-client/src/main/java/com/owlplug/auth/controllers/AccountController.java
  • owlplug-client/src/main/java/com/owlplug/auth/events/AccountUpdateEvent.java
  • owlplug-client/src/main/java/com/owlplug/auth/services/AuthenticationService.java
  • owlplug-client/src/main/java/com/owlplug/core/components/DialogManager.java
  • owlplug-client/src/main/java/com/owlplug/core/components/TaskRunner.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/MainController.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/OptionsController.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/TaskBarController.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/dialogs/CrashRecoveryDialogController.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/dialogs/ListDirectoryDialogController.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/dialogs/WelcomeDialogController.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/fragments/PluginPathFragmentController.java
  • owlplug-client/src/main/java/com/owlplug/core/events/PreferencesChangedEvent.java
  • owlplug-client/src/main/java/com/owlplug/core/services/AppUpdateService.java
  • owlplug-client/src/main/java/com/owlplug/core/services/BaseService.java
  • owlplug-client/src/main/java/com/owlplug/core/services/OptionsService.java
  • owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java
  • owlplug-client/src/main/java/com/owlplug/core/utils/FX.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/ExploreController.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/NewSourceDialogController.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/PackageInfoController.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/SourceMenuController.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/dialogs/InstallStepDialogController.java
  • owlplug-client/src/main/java/com/owlplug/explore/events/RemoteSourceUpdatedEvent.java
  • owlplug-client/src/main/java/com/owlplug/explore/services/ExploreService.java
  • owlplug-client/src/main/java/com/owlplug/plugin/components/PluginTaskFactory.java
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginInfoController.java
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginTableController.java
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginsController.java
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/dialogs/DisablePluginDialogController.java
  • owlplug-client/src/main/java/com/owlplug/plugin/events/PluginRefreshEvent.java
  • owlplug-client/src/main/java/com/owlplug/plugin/events/PluginUpdateEvent.java
  • owlplug-client/src/main/java/com/owlplug/plugin/services/NativeHostService.java
  • owlplug-client/src/main/java/com/owlplug/plugin/services/PluginService.java
  • owlplug-client/src/main/java/com/owlplug/project/controllers/ProjectsController.java
  • owlplug-client/src/main/java/com/owlplug/project/services/PluginLookupService.java
  • owlplug-client/src/main/resources/application.properties
  • owlplug-client/src/main/resources/fxml/MainView.fxml
  • owlplug-client/src/main/resources/fxml/dialogs/ListDirectoryView.fxml
  • owlplug-client/src/main/resources/fxml/explore/ExploreView.fxml
  • owlplug-client/src/main/resources/fxml/explore/PackageInfoView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/ComponentInfoView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/DirectoryInfoView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/NodeInfoView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/PluginInfoView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/PluginsView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/SymlinkInfoView.fxml
  • owlplug-client/src/main/resources/fxml/projects/ProjectInfoView.fxml
  • owlplug-client/src/main/resources/fxml/projects/ProjectsView.fxml
💤 Files with no reviewable changes (6)
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/dialogs/DisablePluginDialogController.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/NewSourceDialogController.java
  • owlplug-client/src/main/java/com/owlplug/plugin/services/NativeHostService.java
  • owlplug-client/src/main/java/com/owlplug/auth/controllers/AccountController.java
  • owlplug-client/src/main/java/com/owlplug/core/services/AppUpdateService.java
  • owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java

Comment thread owlplug-client/src/main/java/com/owlplug/core/components/TaskRunner.java Outdated
Comment thread owlplug-client/src/main/java/com/owlplug/plugin/events/PluginRefreshEvent.java Outdated
Comment thread owlplug-client/src/main/resources/application.properties Outdated
@DropSnorz DropSnorz force-pushed the chore/refactor-controller-di branch from d123793 to c83b1bf Compare March 16, 2026 21:39
@DropSnorz
Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 16, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
owlplug-client/src/main/java/com/owlplug/plugin/services/PluginService.java (2)

148-167: ⚠️ Potential issue | 🟡 Minor

Same pattern: event published after failure path in enablePlugin.

Similar to disablePlugin, the PluginRefreshEvent at line 166 fires even when the rename operation fails.

💡 Consistent fix
     if (originFile.renameTo(destFile)) {
       plugin.setDisabled(false);
       plugin.setPath(newPath);
       pluginRepository.save(plugin);
+      publisher.publishEvent(new PluginRefreshEvent());
     } else {
       log.error("Plugin can't be enabled: failed to rename file {}", plugin.getPath());
     }
-
-    publisher.publishEvent(new PluginRefreshEvent());
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@owlplug-client/src/main/java/com/owlplug/plugin/services/PluginService.java`
around lines 148 - 167, The PluginRefreshEvent is published regardless of
whether the rename succeeded in enablePlugin; move the
publisher.publishEvent(new PluginRefreshEvent()) so it only runs after a
successful rename (i.e., inside the if (originFile.renameTo(destFile)) block
where plugin.setDisabled(false), plugin.setPath(newPath), and
pluginRepository.save(plugin) are executed); keep the error log in the else
branch unchanged so no event is emitted on failure and the success branch still
updates state and publishes the refresh event.

131-146: ⚠️ Potential issue | 🟡 Minor

Event published regardless of rename success.

PluginRefreshEvent is published at line 144 even when the file rename fails (line 141-143). If the rename fails, the plugin state hasn't changed, so triggering a UI refresh may be unnecessary. Consider moving the event publication inside the success branch, or verify this is the intended behavior.

💡 Suggested fix if event should only fire on success
     if (originFile.renameTo(destFile)) {
       plugin.setDisabled(true);
       plugin.setPath(plugin.getPath() + ".disabled");
       pluginRepository.save(plugin);
-
+      publisher.publishEvent(new PluginRefreshEvent());
     } else {
       log.error("Plugin can't be disabled: failed to rename file {}", plugin.getPath());
     }
-    publisher.publishEvent(new PluginRefreshEvent());
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@owlplug-client/src/main/java/com/owlplug/plugin/services/PluginService.java`
around lines 131 - 146, The PluginRefreshEvent is being published
unconditionally in disablePlugin even if originFile.renameTo(destFile) fails;
change the logic so that publisher.publishEvent(new PluginRefreshEvent()) is
moved inside the success branch (after plugin.setDisabled(true),
plugin.setPath(...), and pluginRepository.save(plugin)) so the refresh event is
only fired when the rename and state update succeed; if the intent was to always
notify, add an explicit comment explaining that behavior instead.
🧹 Nitpick comments (4)
owlplug-client/src/main/java/com/owlplug/auth/events/AccountUpdateEvent.java (1)

21-22: Consider adding Javadoc for consistency.

Unlike PluginUpdateEvent which has a descriptive Javadoc, this record lacks documentation. Adding a brief Javadoc would improve consistency across event types.

📝 Suggested Javadoc
+/**
+ * Account data has been updated (created, modified, or deleted).
+ */
 public record AccountUpdateEvent() {
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@owlplug-client/src/main/java/com/owlplug/auth/events/AccountUpdateEvent.java`
around lines 21 - 22, Add a brief Javadoc to the AccountUpdateEvent record to
match the style and consistency of PluginUpdateEvent; open the
AccountUpdateEvent record declaration (AccountUpdateEvent) and insert a short
descriptive Javadoc comment above it describing its purpose (e.g., fired when an
account is created, updated, or deleted) and any relevant usage notes or
authored/see tags to mirror PluginUpdateEvent's documentation style.
owlplug-client/src/main/java/com/owlplug/auth/services/AuthenticationService.java (1)

42-42: Remove unused import for MainController.

The MainController import on line 42 is not referenced anywhere in the class. Following the refactoring to event-driven architecture, the service now uses ApplicationEventPublisher.publishEvent() instead of direct controller calls.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@owlplug-client/src/main/java/com/owlplug/auth/services/AuthenticationService.java`
at line 42, AuthenticationService contains an unused import for MainController;
remove the unused import statement "import
com.owlplug.core.controllers.MainController;" from the AuthenticationService
class so imports reflect the event-driven refactor (the class now uses
ApplicationEventPublisher.publishEvent()). Ensure no other references to
MainController remain in AuthenticationService and run a compile to confirm
imports are clean.
owlplug-client/src/main/java/com/owlplug/core/utils/FX.java (1)

22-22: Unused import: PauseTransition

This import is not used anywhere in the class.

🧹 Suggested fix
 import java.util.concurrent.CompletableFuture;
-import javafx.animation.PauseTransition;
 import javafx.application.Platform;
-import javafx.util.Duration;
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@owlplug-client/src/main/java/com/owlplug/core/utils/FX.java` at line 22,
Remove the unused import of PauseTransition from FX.java; delete the line
importing javafx.animation.PauseTransition so only used imports remain (e.g.,
keep imports used by methods/fields in class FX), ensuring no references to
PauseTransition exist in the class before removing.
owlplug-client/src/main/java/com/owlplug/core/components/DialogManager.java (1)

40-43: Consider adding a null check for dialogContainer.

If newDialog() is called before setDialogContainer() has been invoked (e.g., during early Spring bean initialization), the dialogContainer will be null. Depending on how the Dialog class handles this, it could cause issues.

🛡️ Proposed defensive check
   public Dialog newDialog() {
+    if (dialogContainer == null) {
+      throw new IllegalStateException("Dialog container not initialized. Call setDialogContainer() first.");
+    }
     Dialog dialog = new Dialog();
     dialog.setDialogContainer(dialogContainer);
     return dialog;
   }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@owlplug-client/src/main/java/com/owlplug/core/components/DialogManager.java`
around lines 40 - 43, newDialog() may attempt to set a null dialogContainer if
setDialogContainer(...) hasn't been called; add a defensive null check in
newDialog() that verifies dialogContainer != null and, if it is null, throw an
IllegalStateException (or another appropriate runtime exception) with a clear
message like "dialogContainer not initialized - call setDialogContainer(...)
first" so callers fail fast; update references in newDialog() (and document
behavior) rather than relying on Dialog to handle a null container.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@owlplug-client/src/main/java/com/owlplug/plugin/services/PluginService.java`:
- Around line 148-167: The PluginRefreshEvent is published regardless of whether
the rename succeeded in enablePlugin; move the publisher.publishEvent(new
PluginRefreshEvent()) so it only runs after a successful rename (i.e., inside
the if (originFile.renameTo(destFile)) block where plugin.setDisabled(false),
plugin.setPath(newPath), and pluginRepository.save(plugin) are executed); keep
the error log in the else branch unchanged so no event is emitted on failure and
the success branch still updates state and publishes the refresh event.
- Around line 131-146: The PluginRefreshEvent is being published unconditionally
in disablePlugin even if originFile.renameTo(destFile) fails; change the logic
so that publisher.publishEvent(new PluginRefreshEvent()) is moved inside the
success branch (after plugin.setDisabled(true), plugin.setPath(...), and
pluginRepository.save(plugin)) so the refresh event is only fired when the
rename and state update succeed; if the intent was to always notify, add an
explicit comment explaining that behavior instead.

---

Nitpick comments:
In
`@owlplug-client/src/main/java/com/owlplug/auth/events/AccountUpdateEvent.java`:
- Around line 21-22: Add a brief Javadoc to the AccountUpdateEvent record to
match the style and consistency of PluginUpdateEvent; open the
AccountUpdateEvent record declaration (AccountUpdateEvent) and insert a short
descriptive Javadoc comment above it describing its purpose (e.g., fired when an
account is created, updated, or deleted) and any relevant usage notes or
authored/see tags to mirror PluginUpdateEvent's documentation style.

In
`@owlplug-client/src/main/java/com/owlplug/auth/services/AuthenticationService.java`:
- Line 42: AuthenticationService contains an unused import for MainController;
remove the unused import statement "import
com.owlplug.core.controllers.MainController;" from the AuthenticationService
class so imports reflect the event-driven refactor (the class now uses
ApplicationEventPublisher.publishEvent()). Ensure no other references to
MainController remain in AuthenticationService and run a compile to confirm
imports are clean.

In `@owlplug-client/src/main/java/com/owlplug/core/components/DialogManager.java`:
- Around line 40-43: newDialog() may attempt to set a null dialogContainer if
setDialogContainer(...) hasn't been called; add a defensive null check in
newDialog() that verifies dialogContainer != null and, if it is null, throw an
IllegalStateException (or another appropriate runtime exception) with a clear
message like "dialogContainer not initialized - call setDialogContainer(...)
first" so callers fail fast; update references in newDialog() (and document
behavior) rather than relying on Dialog to handle a null container.

In `@owlplug-client/src/main/java/com/owlplug/core/utils/FX.java`:
- Line 22: Remove the unused import of PauseTransition from FX.java; delete the
line importing javafx.animation.PauseTransition so only used imports remain
(e.g., keep imports used by methods/fields in class FX), ensuring no references
to PauseTransition exist in the class before removing.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 653c6e4c-e25a-4f63-8b89-abebd598d638

📥 Commits

Reviewing files that changed from the base of the PR and between d123793 and c83b1bf.

📒 Files selected for processing (50)
  • owlplug-client/src/main/java/com/owlplug/OwlPlug.java
  • owlplug-client/src/main/java/com/owlplug/auth/controllers/AccountController.java
  • owlplug-client/src/main/java/com/owlplug/auth/events/AccountUpdateEvent.java
  • owlplug-client/src/main/java/com/owlplug/auth/services/AuthenticationService.java
  • owlplug-client/src/main/java/com/owlplug/core/components/DialogManager.java
  • owlplug-client/src/main/java/com/owlplug/core/components/TaskRunner.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/MainController.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/OptionsController.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/dialogs/CrashRecoveryDialogController.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/dialogs/ListDirectoryDialogController.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/dialogs/WelcomeDialogController.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/fragments/PluginPathFragmentController.java
  • owlplug-client/src/main/java/com/owlplug/core/events/PreferencesChangedEvent.java
  • owlplug-client/src/main/java/com/owlplug/core/services/AppUpdateService.java
  • owlplug-client/src/main/java/com/owlplug/core/services/BaseService.java
  • owlplug-client/src/main/java/com/owlplug/core/services/OptionsService.java
  • owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java
  • owlplug-client/src/main/java/com/owlplug/core/utils/FX.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/ExploreController.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/NewSourceDialogController.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/PackageInfoController.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/SourceMenuController.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/dialogs/InstallStepDialogController.java
  • owlplug-client/src/main/java/com/owlplug/explore/events/RemoteSourceUpdatedEvent.java
  • owlplug-client/src/main/java/com/owlplug/explore/services/ExploreService.java
  • owlplug-client/src/main/java/com/owlplug/plugin/components/PluginTaskFactory.java
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginInfoController.java
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginTableController.java
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginsController.java
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/dialogs/DisablePluginDialogController.java
  • owlplug-client/src/main/java/com/owlplug/plugin/events/PluginRefreshEvent.java
  • owlplug-client/src/main/java/com/owlplug/plugin/events/PluginUpdateEvent.java
  • owlplug-client/src/main/java/com/owlplug/plugin/services/NativeHostService.java
  • owlplug-client/src/main/java/com/owlplug/plugin/services/PluginService.java
  • owlplug-client/src/main/java/com/owlplug/project/controllers/ProjectInfoController.java
  • owlplug-client/src/main/java/com/owlplug/project/controllers/ProjectsController.java
  • owlplug-client/src/main/java/com/owlplug/project/services/PluginLookupService.java
  • owlplug-client/src/main/resources/application.properties
  • owlplug-client/src/main/resources/fxml/MainView.fxml
  • owlplug-client/src/main/resources/fxml/dialogs/ListDirectoryView.fxml
  • owlplug-client/src/main/resources/fxml/explore/ExploreView.fxml
  • owlplug-client/src/main/resources/fxml/explore/PackageInfoView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/ComponentInfoView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/DirectoryInfoView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/NodeInfoView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/PluginInfoView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/PluginsView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/SymlinkInfoView.fxml
  • owlplug-client/src/main/resources/fxml/projects/ProjectInfoView.fxml
  • owlplug-client/src/main/resources/fxml/projects/ProjectsView.fxml
💤 Files with no reviewable changes (6)
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/NewSourceDialogController.java
  • owlplug-client/src/main/java/com/owlplug/auth/controllers/AccountController.java
  • owlplug-client/src/main/java/com/owlplug/plugin/services/NativeHostService.java
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/dialogs/DisablePluginDialogController.java
  • owlplug-client/src/main/java/com/owlplug/core/services/AppUpdateService.java
  • owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java
🚧 Files skipped from review as they are similar to previous changes (20)
  • owlplug-client/src/main/java/com/owlplug/plugin/components/PluginTaskFactory.java
  • owlplug-client/src/main/java/com/owlplug/core/services/OptionsService.java
  • owlplug-client/src/main/resources/fxml/plugins/DirectoryInfoView.fxml
  • owlplug-client/src/main/resources/fxml/projects/ProjectsView.fxml
  • owlplug-client/src/main/java/com/owlplug/explore/events/RemoteSourceUpdatedEvent.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/OptionsController.java
  • owlplug-client/src/main/java/com/owlplug/core/events/PreferencesChangedEvent.java
  • owlplug-client/src/main/resources/fxml/plugins/PluginsView.fxml
  • owlplug-client/src/main/resources/application.properties
  • owlplug-client/src/main/java/com/owlplug/project/services/PluginLookupService.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/SourceMenuController.java
  • owlplug-client/src/main/java/com/owlplug/core/components/TaskRunner.java
  • owlplug-client/src/main/java/com/owlplug/plugin/events/PluginRefreshEvent.java
  • owlplug-client/src/main/resources/fxml/plugins/ComponentInfoView.fxml
  • owlplug-client/src/main/java/com/owlplug/OwlPlug.java
  • owlplug-client/src/main/java/com/owlplug/core/services/BaseService.java
  • owlplug-client/src/main/java/com/owlplug/explore/services/ExploreService.java
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginInfoController.java
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginTableController.java
  • owlplug-client/src/main/resources/fxml/dialogs/ListDirectoryView.fxml

@DropSnorz DropSnorz force-pushed the chore/refactor-controller-di branch from be35e46 to a02a95b Compare March 23, 2026 21:33
@DropSnorz
Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 23, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@DropSnorz DropSnorz marked this pull request as ready for review March 23, 2026 21:35
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
owlplug-client/src/main/java/com/owlplug/explore/services/ExploreService.java (1)

256-258: ⚠️ Potential issue | 🟠 Major

Publish event after delete() for consistency with save() and enableSource().

The delete() method does not publish RemoteSourceUpdatedEvent, unlike save() (line 250-254) and enableSource() (line 244-248). Controllers including SourceMenuController (line 155-157) and ExploreController (line 405-407) have event listeners registered for this event. While the current caller manually invokes refreshView() as a workaround, this inconsistency breaks the established service pattern and risks stale UI state if additional callers are added without manual refresh logic.

♻️ Proposed fix
 public void delete(RemoteSource remoteSource) {
   remoteSourceRepository.delete(remoteSource);
+  publisher.publishEvent(new RemoteSourceUpdatedEvent(remoteSource));
 }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@owlplug-client/src/main/java/com/owlplug/explore/services/ExploreService.java`
around lines 256 - 258, The delete(RemoteSource) method currently only calls
remoteSourceRepository.delete(remoteSource) — update it to publish the same
RemoteSourceUpdatedEvent as save() and enableSource() so listeners (e.g.,
SourceMenuController, ExploreController) receive updates; after performing the
delete call, invoke the existing applicationEventPublisher.publishEvent(...)
with a new RemoteSourceUpdatedEvent carrying the deleted RemoteSource (matching
the pattern used in save() and enableSource()) so UI refreshes remain
consistent.
🧹 Nitpick comments (1)
owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginInfoController.java (1)

265-269: Minor: Missing blank line before @EventListener.

For consistency with other event listener declarations in the codebase, consider adding a blank line before the @EventListener annotation.

Suggested formatting
   }
+
   `@EventListener`
   private void handle(PluginRefreshEvent event) {
     FX.run(this::refresh);
   }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginInfoController.java`
around lines 265 - 269, Add a blank line before the `@EventListener` annotation in
PluginInfoController to match project formatting conventions; locate the private
void handle(PluginRefreshEvent event) method (the event listener that calls
FX.run(this::refresh)) and insert a single empty line immediately above the
`@EventListener` annotation so it is separated from the previous method or block.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@owlplug-client/src/main/java/com/owlplug/OwlPlug.java`:
- Line 170: Replace the byte-based heap sizing in the
ResourcePoolsBuilder.newResourcePoolsBuilder().heap(200, MemoryUnit.MB) call
with entry-based sizing using EntryUnit.ENTRIES and pick a sensible entries
limit; add a short inline comment near the ResourcePoolsBuilder invocation (in
OwlPlug.java) documenting the rationale for the chosen entry count (expected
average cache object size, concurrency, and eviction behavior) so future
reviewers understand why that number was chosen; ensure you import
org.ehcache.config.units.EntryUnit and remove or stop using MemoryUnit for heap
sizing to avoid the deprecated byte-based traversal.

---

Outside diff comments:
In
`@owlplug-client/src/main/java/com/owlplug/explore/services/ExploreService.java`:
- Around line 256-258: The delete(RemoteSource) method currently only calls
remoteSourceRepository.delete(remoteSource) — update it to publish the same
RemoteSourceUpdatedEvent as save() and enableSource() so listeners (e.g.,
SourceMenuController, ExploreController) receive updates; after performing the
delete call, invoke the existing applicationEventPublisher.publishEvent(...)
with a new RemoteSourceUpdatedEvent carrying the deleted RemoteSource (matching
the pattern used in save() and enableSource()) so UI refreshes remain
consistent.

---

Nitpick comments:
In
`@owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginInfoController.java`:
- Around line 265-269: Add a blank line before the `@EventListener` annotation in
PluginInfoController to match project formatting conventions; locate the private
void handle(PluginRefreshEvent event) method (the event listener that calls
FX.run(this::refresh)) and insert a single empty line immediately above the
`@EventListener` annotation so it is separated from the previous method or block.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 9dffa416-fedc-4624-b6f4-f92036501904

📥 Commits

Reviewing files that changed from the base of the PR and between c83b1bf and a02a95b.

📒 Files selected for processing (50)
  • owlplug-client/src/main/java/com/owlplug/OwlPlug.java
  • owlplug-client/src/main/java/com/owlplug/auth/controllers/AccountController.java
  • owlplug-client/src/main/java/com/owlplug/auth/events/AccountUpdateEvent.java
  • owlplug-client/src/main/java/com/owlplug/auth/services/AuthenticationService.java
  • owlplug-client/src/main/java/com/owlplug/core/components/DialogManager.java
  • owlplug-client/src/main/java/com/owlplug/core/components/TaskRunner.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/MainController.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/OptionsController.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/dialogs/CrashRecoveryDialogController.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/dialogs/ListDirectoryDialogController.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/dialogs/WelcomeDialogController.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/fragments/PluginPathFragmentController.java
  • owlplug-client/src/main/java/com/owlplug/core/events/PreferencesChangedEvent.java
  • owlplug-client/src/main/java/com/owlplug/core/services/AppUpdateService.java
  • owlplug-client/src/main/java/com/owlplug/core/services/BaseService.java
  • owlplug-client/src/main/java/com/owlplug/core/services/OptionsService.java
  • owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java
  • owlplug-client/src/main/java/com/owlplug/core/utils/FX.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/ExploreController.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/NewSourceDialogController.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/PackageInfoController.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/SourceMenuController.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/dialogs/InstallStepDialogController.java
  • owlplug-client/src/main/java/com/owlplug/explore/events/RemoteSourceUpdatedEvent.java
  • owlplug-client/src/main/java/com/owlplug/explore/services/ExploreService.java
  • owlplug-client/src/main/java/com/owlplug/plugin/components/PluginTaskFactory.java
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginInfoController.java
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginTableController.java
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/PluginsController.java
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/dialogs/DisablePluginDialogController.java
  • owlplug-client/src/main/java/com/owlplug/plugin/events/PluginRefreshEvent.java
  • owlplug-client/src/main/java/com/owlplug/plugin/events/PluginUpdateEvent.java
  • owlplug-client/src/main/java/com/owlplug/plugin/services/NativeHostService.java
  • owlplug-client/src/main/java/com/owlplug/plugin/services/PluginService.java
  • owlplug-client/src/main/java/com/owlplug/project/controllers/ProjectInfoController.java
  • owlplug-client/src/main/java/com/owlplug/project/controllers/ProjectsController.java
  • owlplug-client/src/main/java/com/owlplug/project/services/PluginLookupService.java
  • owlplug-client/src/main/resources/application.properties
  • owlplug-client/src/main/resources/fxml/MainView.fxml
  • owlplug-client/src/main/resources/fxml/dialogs/ListDirectoryView.fxml
  • owlplug-client/src/main/resources/fxml/explore/ExploreView.fxml
  • owlplug-client/src/main/resources/fxml/explore/PackageInfoView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/ComponentInfoView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/DirectoryInfoView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/NodeInfoView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/PluginInfoView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/PluginsView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/SymlinkInfoView.fxml
  • owlplug-client/src/main/resources/fxml/projects/ProjectInfoView.fxml
  • owlplug-client/src/main/resources/fxml/projects/ProjectsView.fxml
💤 Files with no reviewable changes (6)
  • owlplug-client/src/main/java/com/owlplug/core/services/AppUpdateService.java
  • owlplug-client/src/main/java/com/owlplug/plugin/services/NativeHostService.java
  • owlplug-client/src/main/java/com/owlplug/auth/controllers/AccountController.java
  • owlplug-client/src/main/java/com/owlplug/plugin/controllers/dialogs/DisablePluginDialogController.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/NewSourceDialogController.java
  • owlplug-client/src/main/java/com/owlplug/core/services/TelemetryService.java
✅ Files skipped from review due to trivial changes (21)
  • owlplug-client/src/main/java/com/owlplug/core/services/BaseService.java
  • owlplug-client/src/main/java/com/owlplug/core/services/OptionsService.java
  • owlplug-client/src/main/java/com/owlplug/core/events/PreferencesChangedEvent.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/fragments/PluginPathFragmentController.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/dialogs/InstallStepDialogController.java
  • owlplug-client/src/main/resources/application.properties
  • owlplug-client/src/main/java/com/owlplug/auth/events/AccountUpdateEvent.java
  • owlplug-client/src/main/resources/fxml/plugins/PluginInfoView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/ComponentInfoView.fxml
  • owlplug-client/src/main/resources/fxml/projects/ProjectsView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/SymlinkInfoView.fxml
  • owlplug-client/src/main/resources/fxml/plugins/PluginsView.fxml
  • owlplug-client/src/main/java/com/owlplug/project/controllers/ProjectInfoController.java
  • owlplug-client/src/main/resources/fxml/MainView.fxml
  • owlplug-client/src/main/resources/fxml/projects/ProjectInfoView.fxml
  • owlplug-client/src/main/resources/fxml/explore/ExploreView.fxml
  • owlplug-client/src/main/java/com/owlplug/plugin/events/PluginRefreshEvent.java
  • owlplug-client/src/main/java/com/owlplug/explore/events/RemoteSourceUpdatedEvent.java
  • owlplug-client/src/main/resources/fxml/dialogs/ListDirectoryView.fxml
  • owlplug-client/src/main/java/com/owlplug/core/utils/FX.java
  • owlplug-client/src/main/java/com/owlplug/project/controllers/ProjectsController.java
🚧 Files skipped from review as they are similar to previous changes (8)
  • owlplug-client/src/main/resources/fxml/plugins/DirectoryInfoView.fxml
  • owlplug-client/src/main/java/com/owlplug/core/components/TaskRunner.java
  • owlplug-client/src/main/java/com/owlplug/plugin/components/PluginTaskFactory.java
  • owlplug-client/src/main/java/com/owlplug/project/services/PluginLookupService.java
  • owlplug-client/src/main/java/com/owlplug/auth/services/AuthenticationService.java
  • owlplug-client/src/main/java/com/owlplug/explore/controllers/SourceMenuController.java
  • owlplug-client/src/main/java/com/owlplug/plugin/events/PluginUpdateEvent.java
  • owlplug-client/src/main/java/com/owlplug/core/controllers/dialogs/CrashRecoveryDialogController.java

Comment thread owlplug-client/src/main/java/com/owlplug/OwlPlug.java
@DropSnorz DropSnorz merged commit 654d8d7 into master Mar 23, 2026
3 of 4 checks passed
@DropSnorz DropSnorz modified the milestones: 2.0.0, 1.33.0 Apr 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant