# mihalypal/biroplugin architecture

> Architecture diagram of the GitHub repository mihalypal/biroplugin, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-14). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/mihalypal/biroplugin
- Repository: https://github.com/mihalypal/biroplugin

## Overview

BiroPlugin is an IntelliJ IDEA client for Biro 3: users sign in, browse courses and assignments, open an assignment’s exercises, work with starter files in the IDE project, and submit files. The map preserves the documented workflow and the sampled UI, authentication, assignment, and file/submission responsibilities. Some product stages are documented but their complete implementations were not sampled, so their links are omitted or marked unverified rather than inferred.

Main entry points: [`src/main/java/com/github/mihalypal/biroplugin/UIForms/AssignmentView.java`](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/UIForms/AssignmentView.java) (Assignment view), [`src/main/java/com/github/mihalypal/biroplugin/Services/UserServices.java`](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Services/UserServices.java) (Authentication), [`src/main/java/com/github/mihalypal/biroplugin/UIForms/BiroUIMainForm.java`](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/UIForms/BiroUIMainForm.java) (Course browser), [`src/main/java/com/github/mihalypal/biroplugin/Services/UploadService.java`](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Services/UploadService.java) (Submission service)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["IDE entry"]
  node_tool_factory["Tool window factory"]
  node_tool_ui["Tool window UI"]
  node_bundle["Message bundle<br/>[MyBundle.kt]"]
end

subgraph group_ui["Plugin interface"]
  node_login["Login form"]
  node_main_form["Course browser"]
  node_assignment_view["Assignment view"]
  node_upload_dialog["File selection"]
  node_assignment_render["Assignment rendering"]
  node_button_style["Button styling"]
  node_progress_style["Progress styling"]
end

subgraph group_domain["Assignment domain"]
  node_assignment_model["Assignment data<br/>[Assignment.java]"]
  node_exercise_status["Exercise status"]
  node_starter_file["Starter file<br/>[StarterFile.java]"]
end

subgraph group_services["Biro services"]
  node_auth["Authentication<br/>[UserServices.java]"]
  node_submission["Submission service<br/>[UploadService.java]"]
end

subgraph group_project["IDE project files"]
  node_file_service["Project file setup<br/>[FileService.java]"]
  node_png_converter["Image conversion<br/>[PNGConverter.java]"]
  node_image_transcoder["Image transcoder"]
end

node_user(("IDE user"))
node_biro_api{{"Biro 3 API"}}
node_ide_project[("IDE project")]

node_user -.->|"opens plugin"| node_tool_factory
node_tool_factory -->|"creates"| node_tool_ui
node_tool_ui -->|"displays"| node_login
node_login -->|"opens after login"| node_main_form
node_main_form -->|"requests course data"| node_auth
node_main_form -->|"opens selection"| node_assignment_view
node_main_form -->|"renders list"| node_assignment_render
node_assignment_view -->|"fetches assignment"| node_auth
node_assignment_view -->|"builds data"| node_assignment_model
node_assignment_model -->|"contains status"| node_exercise_status
node_assignment_view -->|"selects files"| node_upload_dialog
node_assignment_view -->|"prepares exercise"| node_file_service
node_assignment_view -->|"submits work"| node_submission
node_submission -->|"refreshes token"| node_auth
node_auth -->|"authenticates"| node_biro_api
node_submission -->|"sends submissions"| node_biro_api
node_auth -->|"fetches data"| node_biro_api
node_file_service -->|"creates files"| node_ide_project
node_submission -->|"reads selected files"| node_ide_project
node_assignment_view -->|"styles controls"| node_button_style
node_assignment_view -->|"styles progress"| node_progress_style
node_png_converter -->|"uses"| node_image_transcoder

click node_tool_factory "https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/toolWindow/MyToolWindowFactory.java"
click node_tool_ui "https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/toolWindow/MyToolWindowUI.java"
click node_login "https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/UIForms/BiroUILoginForm.java"
click node_main_form "https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/UIForms/BiroUIMainForm.java"
click node_assignment_view "https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/UIForms/AssignmentView.java"
click node_upload_dialog "https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Dialog/FileUploadDialog.java"
click node_assignment_model "https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Model/Assignment.java"
click node_exercise_status "https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Model/ExerciseStatus.java"
click node_starter_file "https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Model/StarterFile.java"
click node_auth "https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Services/UserServices.java"
click node_submission "https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Services/UploadService.java"
click node_file_service "https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Services/FileService.java"
click node_png_converter "https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Services/PNGConverter.java"
click node_image_transcoder "https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Services/BufferedImageTranscoder.java"
click node_assignment_render "https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/appearanceChanges/AssignmentCellRenderer.java"
click node_button_style "https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/appearanceChanges/CustomButtonUI.java"
click node_progress_style "https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/appearanceChanges/CustomProgressBarUI.java"
click node_bundle "https://github.com/mihalypal/biroplugin/blob/main/src/main/kotlin/com/github/mihalypal/biroplugin/MyBundle.kt"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_tool_factory,node_tool_ui,node_bundle,node_user toneBlue
class node_login,node_main_form,node_assignment_view,node_upload_dialog,node_assignment_render,node_button_style,node_progress_style,node_ide_project toneAmber
class node_assignment_model,node_exercise_status,node_starter_file,node_biro_api toneMint
class node_auth,node_submission toneRose
class node_file_service,node_png_converter,node_image_transcoder toneIndigo
```

## Components

### IDE entry

- [Tool window factory](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/toolWindow/MyToolWindowFactory.java): `src/main/java/com/github/mihalypal/biroplugin/toolWindow/MyToolWindowFactory.java`
- [Tool window UI](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/toolWindow/MyToolWindowUI.java): `src/main/java/com/github/mihalypal/biroplugin/toolWindow/MyToolWindowUI.java`
- [Message bundle](https://github.com/mihalypal/biroplugin/blob/main/src/main/kotlin/com/github/mihalypal/biroplugin/MyBundle.kt): `src/main/kotlin/com/github/mihalypal/biroplugin/MyBundle.kt`

### Plugin interface

- [Login form](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/UIForms/BiroUILoginForm.java): `src/main/java/com/github/mihalypal/biroplugin/UIForms/BiroUILoginForm.java`
- [Course browser](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/UIForms/BiroUIMainForm.java): `src/main/java/com/github/mihalypal/biroplugin/UIForms/BiroUIMainForm.java`
- [Assignment view](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/UIForms/AssignmentView.java): `src/main/java/com/github/mihalypal/biroplugin/UIForms/AssignmentView.java`
- [File selection](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Dialog/FileUploadDialog.java): `src/main/java/com/github/mihalypal/biroplugin/Dialog/FileUploadDialog.java`
- [Assignment rendering](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/appearanceChanges/AssignmentCellRenderer.java): `src/main/java/com/github/mihalypal/biroplugin/appearanceChanges/AssignmentCellRenderer.java`
- [Button styling](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/appearanceChanges/CustomButtonUI.java): `src/main/java/com/github/mihalypal/biroplugin/appearanceChanges/CustomButtonUI.java`
- [Progress styling](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/appearanceChanges/CustomProgressBarUI.java): `src/main/java/com/github/mihalypal/biroplugin/appearanceChanges/CustomProgressBarUI.java`

### Assignment domain

- [Assignment data](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Model/Assignment.java): `src/main/java/com/github/mihalypal/biroplugin/Model/Assignment.java`
- [Exercise status](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Model/ExerciseStatus.java): `src/main/java/com/github/mihalypal/biroplugin/Model/ExerciseStatus.java`
- [Starter file](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Model/StarterFile.java): `src/main/java/com/github/mihalypal/biroplugin/Model/StarterFile.java`

### Biro services

- [Authentication](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Services/UserServices.java): `src/main/java/com/github/mihalypal/biroplugin/Services/UserServices.java`
- [Submission service](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Services/UploadService.java): `src/main/java/com/github/mihalypal/biroplugin/Services/UploadService.java`

### IDE project files

- [Project file setup](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Services/FileService.java): `src/main/java/com/github/mihalypal/biroplugin/Services/FileService.java`
- [Image conversion](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Services/PNGConverter.java): `src/main/java/com/github/mihalypal/biroplugin/Services/PNGConverter.java`
- [Image transcoder](https://github.com/mihalypal/biroplugin/blob/main/src/main/java/com/github/mihalypal/biroplugin/Services/BufferedImageTranscoder.java): `src/main/java/com/github/mihalypal/biroplugin/Services/BufferedImageTranscoder.java`

### Other components

- **IDE user**
- **Biro 3 API**
- **IDE project**

## Connections

- IDE user → Tool window factory: opens plugin
- Tool window factory → Tool window UI: creates (evidence: `src/main/java/com/github/mihalypal/biroplugin/toolWindow/MyToolWindowFactory.java`)
- Tool window UI → Login form: displays (evidence: `src/main/java/com/github/mihalypal/biroplugin/toolWindow/MyToolWindowUI.java`)
- Login form → Course browser: opens after login (evidence: `src/main/java/com/github/mihalypal/biroplugin/UIForms/BiroUILoginForm.java`)
- Course browser → Authentication: requests course data (evidence: `src/main/java/com/github/mihalypal/biroplugin/UIForms/BiroUIMainForm.java`)
- Course browser → Assignment view: opens selection (evidence: `src/main/java/com/github/mihalypal/biroplugin/UIForms/BiroUIMainForm.java`)
- Course browser → Assignment rendering: renders list (evidence: `src/main/java/com/github/mihalypal/biroplugin/UIForms/BiroUIMainForm.java`)
- Assignment view → Authentication: fetches assignment (evidence: `src/main/java/com/github/mihalypal/biroplugin/UIForms/AssignmentView.java`)
- Assignment view → Assignment data: builds data (evidence: `src/main/java/com/github/mihalypal/biroplugin/UIForms/AssignmentView.java`)
- Assignment data → Exercise status: contains status (evidence: `src/main/java/com/github/mihalypal/biroplugin/Model/Assignment.java`)
- Assignment view → File selection: selects files (evidence: `src/main/java/com/github/mihalypal/biroplugin/UIForms/AssignmentView.java`)
- Assignment view → Project file setup: prepares exercise (evidence: `src/main/java/com/github/mihalypal/biroplugin/UIForms/AssignmentView.java`)
- Assignment view → Submission service: submits work (evidence: `src/main/java/com/github/mihalypal/biroplugin/UIForms/AssignmentView.java`)
- Submission service → Authentication: refreshes token (evidence: `src/main/java/com/github/mihalypal/biroplugin/Services/UploadService.java`)
- Authentication → Biro 3 API: authenticates (evidence: `src/main/java/com/github/mihalypal/biroplugin/Services/UserServices.java`)
- Submission service → Biro 3 API: sends submissions (evidence: `src/main/java/com/github/mihalypal/biroplugin/Services/UploadService.java`)
- Authentication → Biro 3 API: fetches data (evidence: `src/main/java/com/github/mihalypal/biroplugin/Services/UserServices.java`)
- Project file setup → IDE project: creates files (evidence: `src/main/java/com/github/mihalypal/biroplugin/Services/FileService.java`)
- Submission service → IDE project: reads selected files (evidence: `src/main/java/com/github/mihalypal/biroplugin/Services/UploadService.java`)
- Assignment view → Button styling: styles controls (evidence: `src/main/java/com/github/mihalypal/biroplugin/UIForms/AssignmentView.java`)
- Assignment view → Progress styling: styles progress (evidence: `src/main/java/com/github/mihalypal/biroplugin/UIForms/AssignmentView.java`)
- Image conversion → Image transcoder: uses (evidence: `src/main/java/com/github/mihalypal/biroplugin/Services/PNGConverter.java`)
