# laingotiana/framework-examen-s5 architecture

> Architecture diagram of the GitHub repository laingotiana/framework-examen-s5, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-25). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/laingotiana/framework-examen-s5
- Repository: https://github.com/laingotiana/framework-examen-s5

## Overview

This is a lightweight SpringMVC-like Java web framework. Its principal workflow is servlet startup and request dispatch, route selection, request/session binding and authorization, controller invocation, then forwarding a view or writing JSON. The graph includes the scanner and upload helper as documented-by-code capabilities, but their wiring into the engine is not shown in the sampled excerpts, so no call edges are inferred for them.

Main entry points: [`src/main/java/framework/RouterEngine.java`](https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/RouterEngine.java) (Router Engine), [`src/main/java/framework/servlet/FrontServlet.java`](https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/servlet/FrontServlet.java) (Front Servlet), [`src/main/java/framework/listener/RouterEngineInitializer.java`](https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/listener/RouterEngineInitializer.java) (Engine Initializer), [`src/main/java/framework/util/ModelView.java`](https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/util/ModelView.java) (Model View)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_startup["Startup and Routing"]
  node_initializer["Engine Initializer"]
  node_scanner["Controller Scanner"]
  node_route["Route Mapping<br/>[RouteMapping.java]"]
  node_annotations["Route and Binding Annotations"]
end

subgraph group_execution["Request Execution"]
  node_engine["Router Engine<br/>[RouterEngine.java]"]
  node_servlet["Front Servlet<br/>[FrontServlet.java]"]
end

subgraph group_responses["Response Handling"]
  node_modelview["Model View<br/>[ModelView.java]"]
  node_jsondata["JSON Data<br/>[JsonData.java]"]
  node_jsonholder["JSON Holder<br/>[JsonHolder.java]"]
  node_dispatcher["View Dispatcher"]
end

subgraph group_security["Security and Uploads"]
  node_security["Security Config"]
  node_unauthorized["Unauthorized Error"]
  node_upload["Uploaded File<br/>[UploadedFile.java]"]
  node_session[("HTTP Session")]
end

node_container(("Servlet Container"))
node_caller(("HTTP Client"))
node_controllers["Application Controllers"]

node_container -->|"initializes"| node_initializer
node_initializer -->|"creates and configures"| node_engine
node_initializer -->|"stores engine"| node_container
node_container -->|"dispatches requests"| node_servlet
node_caller -->|"sends request"| node_servlet
node_servlet -->|"dispatches URL"| node_engine
node_engine -->|"selects mapping"| node_route
node_engine -->|"inspects metadata"| node_annotations
node_engine -->|"reads role key"| node_security
node_engine -->|"reads and writes"| node_session
node_engine -->|"raises on denial"| node_unauthorized
node_engine -->|"invokes handler"| node_controllers
node_controllers -->|"returns result"| node_engine
node_engine -->|"returns view model"| node_modelview
node_engine -->|"builds JSON response"| node_jsondata
node_engine -->|"returns JSON payload"| node_jsonholder
node_servlet -->|"reads view data"| node_modelview
node_servlet -->|"forwards view"| node_dispatcher
node_servlet -->|"writes JSON"| node_jsonholder
node_servlet -->|"forwards static resource"| node_container
node_upload --> node_session

click node_initializer "https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/listener/RouterEngineInitializer.java"
click node_scanner "https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/util/JavaControllerScanner.java"
click node_engine "https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/RouterEngine.java"
click node_servlet "https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/servlet/FrontServlet.java"
click node_route "https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/util/RouteMapping.java"
click node_annotations "https://github.com/laingotiana/framework-examen-s5/tree/main/src/main/java/framework/annotation"
click node_modelview "https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/util/ModelView.java"
click node_jsondata "https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/dto/JsonData.java"
click node_jsonholder "https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/dto/JsonHolder.java"
click node_security "https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/config/SecurityConfig.java"
click node_unauthorized "https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/exception/UnauthorizedException.java"
click node_upload "https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/util/UploadedFile.java"

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_initializer,node_scanner,node_route,node_annotations,node_caller toneBlue
class node_engine,node_servlet toneAmber
class node_modelview,node_jsondata,node_jsonholder,node_dispatcher toneMint
class node_security,node_unauthorized,node_upload,node_session toneRose
class node_container,node_controllers toneIndigo
```

## Components

### Startup and Routing

- [Engine Initializer](https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/listener/RouterEngineInitializer.java): `src/main/java/framework/listener/RouterEngineInitializer.java`
- [Controller Scanner](https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/util/JavaControllerScanner.java): `src/main/java/framework/util/JavaControllerScanner.java`
- [Route Mapping](https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/util/RouteMapping.java): `src/main/java/framework/util/RouteMapping.java`
- [Route and Binding Annotations](https://github.com/laingotiana/framework-examen-s5/tree/main/src/main/java/framework/annotation): `src/main/java/framework/annotation`

### Request Execution

- [Router Engine](https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/RouterEngine.java): `src/main/java/framework/RouterEngine.java`
- [Front Servlet](https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/servlet/FrontServlet.java): `src/main/java/framework/servlet/FrontServlet.java`

### Response Handling

- [Model View](https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/util/ModelView.java): `src/main/java/framework/util/ModelView.java`
- [JSON Data](https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/dto/JsonData.java): `src/main/java/framework/dto/JsonData.java`
- [JSON Holder](https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/dto/JsonHolder.java): `src/main/java/framework/dto/JsonHolder.java`
- **View Dispatcher**

### Security and Uploads

- [Security Config](https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/config/SecurityConfig.java): `src/main/java/framework/config/SecurityConfig.java`
- [Unauthorized Error](https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/exception/UnauthorizedException.java): `src/main/java/framework/exception/UnauthorizedException.java`
- [Uploaded File](https://github.com/laingotiana/framework-examen-s5/blob/main/src/main/java/framework/util/UploadedFile.java): `src/main/java/framework/util/UploadedFile.java`
- **HTTP Session**

### Other components

- **Servlet Container**
- **HTTP Client**
- **Application Controllers**

## Connections

- Servlet Container → Engine Initializer: initializes
- Engine Initializer → Router Engine: creates and configures
- Engine Initializer → Servlet Container: stores engine
- Servlet Container → Front Servlet: dispatches requests
- HTTP Client → Front Servlet: sends request
- Front Servlet → Router Engine: dispatches URL
- Router Engine → Route Mapping: selects mapping
- Router Engine → Route and Binding Annotations: inspects metadata
- Router Engine → Security Config: reads role key
- Router Engine → HTTP Session: reads and writes
- Router Engine → Unauthorized Error: raises on denial
- Router Engine → Application Controllers: invokes handler
- Application Controllers → Router Engine: returns result
- Router Engine → Model View: returns view model
- Router Engine → JSON Data: builds JSON response
- Router Engine → JSON Holder: returns JSON payload
- Front Servlet → Model View: reads view data
- Front Servlet → View Dispatcher: forwards view
- Front Servlet → JSON Holder: writes JSON
- Front Servlet → Servlet Container: forwards static resource
- Uploaded File → HTTP Session
