# todaynightt/printing-factory architecture

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

- Interactive diagram: https://gitdiagram.com/todaynightt/printing-factory
- Repository: https://github.com/todaynightt/printing-factory

## Overview

Printing Factory watches the configured print directory, queues newly created files, prepares each supported document and its print options, then submits it as an IPP job and tracks completion. The graph separates filesystem watching, job preparation, and printer protocol operations. The README establishes the product workflow; source excerpts and the SOURCE INDEX support the shown wiring. Several runtime components were indexed but not excerpted, so their relationships are limited to those references.

Main entry points: [`src/main/java/org/printing_factory/Application.java`](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/Application.java) (Application setup), [`src/main/java/org/printing_factory/JobCreator.java`](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/JobCreator.java) (Job creator), [`src/main/java/org/printing_factory/printing/ipp/jobs/SendDocument.java`](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/printing/ipp/jobs/SendDocument.java) (Send document), [`src/main/java/org/printing_factory/watcher/LocalWatcher.java`](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/watcher/LocalWatcher.java) (Local watcher)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["Application runtime"]
  node_main["Program entry<br/>[Main.java]"]
  node_application["Application setup<br/>[Application.java]"]
  node_config["Environment config<br/>[Config.java]"]
end

subgraph group_watching["File watching"]
  node_watchpath["Watch path<br/>[WatchPath.java]"]
  node_watchfactory["Watcher factory"]
  node_watcher["Local watcher<br/>[LocalWatcher.java]"]
  node_filequeue["File path queue<br/>[Application.java]"]
end

subgraph group_preparation["Job preparation"]
  node_creator["Job creator<br/>[JobCreator.java]"]
  node_documents["Document manager"]
  node_descriptor["File descriptor"]
  node_formats["Document formats<br/>[DocFormat.java]"]
  node_options["Filename options<br/>[PathParser.java]"]
end

subgraph group_printing["IPP printing"]
  node_printerclient["Printer client<br/>[Printer.java]"]
  node_connection["IPP connection<br/>[IppConnection.java]"]
  node_jobqueue["Print job queue<br/>[Application.java]"]
  node_jobsender["Job sender<br/>[JobsSender.java]"]
  node_createjob["Create job<br/>[CreateJob.java]"]
  node_senddocument["Send document<br/>[SendDocument.java]"]
  node_jobattributes["Job attributes"]
  node_status["Status checker<br/>[StatusChecker.java]"]
end

node_operator(("Print operator"))
node_printdir["Print directory"]
node_printer(("IPP printer"))

node_operator -->|"places files"| node_printdir
node_printdir -->|"file changes"| node_watcher
node_main -->|"starts"| node_application
node_application -->|"loads"| node_config
node_application -->|"configures"| node_watchpath
node_application -->|"creates"| node_watchfactory
node_watchfactory -->|"selects"| node_watcher
node_application -->|"starts watching"| node_watcher
node_watcher -->|"queues paths"| node_filequeue
node_application -->|"starts worker"| node_creator
node_creator -.->|"takes paths"| node_filequeue
node_creator -->|"prepares files"| node_documents
node_documents -->|"classifies file"| node_descriptor
node_descriptor -->|"parses options"| node_options
node_documents -.->|"checks format"| node_formats
node_creator -->|"uses printer"| node_printerclient
node_application -->|"configures URI"| node_printerclient
node_printerclient -->|"opens connection"| node_connection
node_connection -->|"sends IPP requests"| node_printer
node_creator -->|"creates job"| node_createjob
node_createjob -->|"returns sender"| node_senddocument
node_creator -.->|"enqueues jobs"| node_jobqueue
node_application -->|"starts worker"| node_jobsender
node_jobsender -.->|"takes jobs"| node_jobqueue
node_jobsender -->|"sends document"| node_senddocument
node_senddocument -->|"sends request"| node_connection
node_senddocument -->|"returns tracker"| node_jobattributes
node_application -->|"starts worker"| node_status
node_status -->|"checks completion"| node_jobattributes
node_jobattributes -->|"queries job"| node_connection

click node_main "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/Main.java"
click node_application "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/Application.java"
click node_config "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/config/Config.java"
click node_watchpath "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/watcher/path/WatchPath.java"
click node_watchfactory "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/watcher/WatcherFactory.java"
click node_watcher "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/watcher/LocalWatcher.java"
click node_filequeue "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/Application.java"
click node_creator "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/JobCreator.java"
click node_documents "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/docu/DocumentManager.java"
click node_descriptor "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/file/FileDescriptor.java"
click node_formats "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/docu/DocFormat.java"
click node_options "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/printing/PathParser.java"
click node_printerclient "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/printing/Printer.java"
click node_connection "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/printing/IppConnection.java"
click node_jobqueue "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/Application.java"
click node_jobsender "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/JobsSender.java"
click node_createjob "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/printing/ipp/jobs/CreateJob.java"
click node_senddocument "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/printing/ipp/jobs/SendDocument.java"
click node_jobattributes "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/printing/ipp/jobs/GetJobAttributes.java"
click node_status "https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/StatusChecker.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_main,node_application,node_config toneBlue
class node_watchpath,node_watchfactory,node_watcher,node_filequeue toneAmber
class node_creator,node_documents,node_descriptor,node_formats,node_options toneMint
class node_printerclient,node_connection,node_jobqueue,node_jobsender,node_createjob,node_senddocument,node_jobattributes,node_status toneRose
class node_operator,node_printdir,node_printer toneIndigo
```

## Components

### Application runtime

- [Program entry](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/Main.java): `src/main/java/org/printing_factory/Main.java`
- [Application setup](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/Application.java): `src/main/java/org/printing_factory/Application.java`
- [Environment config](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/config/Config.java): `src/main/java/org/printing_factory/config/Config.java`

### File watching

- [Watch path](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/watcher/path/WatchPath.java): `src/main/java/org/printing_factory/watcher/path/WatchPath.java`
- [Watcher factory](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/watcher/WatcherFactory.java): `src/main/java/org/printing_factory/watcher/WatcherFactory.java`
- [Local watcher](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/watcher/LocalWatcher.java): `src/main/java/org/printing_factory/watcher/LocalWatcher.java`
- [File path queue](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/Application.java): `src/main/java/org/printing_factory/Application.java`

### Job preparation

- [Job creator](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/JobCreator.java): `src/main/java/org/printing_factory/JobCreator.java`
- [Document manager](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/docu/DocumentManager.java): `src/main/java/org/printing_factory/docu/DocumentManager.java`
- [File descriptor](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/file/FileDescriptor.java): `src/main/java/org/printing_factory/file/FileDescriptor.java`
- [Document formats](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/docu/DocFormat.java): `src/main/java/org/printing_factory/docu/DocFormat.java`
- [Filename options](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/printing/PathParser.java): `src/main/java/org/printing_factory/printing/PathParser.java`

### IPP printing

- [Printer client](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/printing/Printer.java): `src/main/java/org/printing_factory/printing/Printer.java`
- [IPP connection](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/printing/IppConnection.java): `src/main/java/org/printing_factory/printing/IppConnection.java`
- [Print job queue](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/Application.java): `src/main/java/org/printing_factory/Application.java`
- [Job sender](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/JobsSender.java): `src/main/java/org/printing_factory/JobsSender.java`
- [Create job](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/printing/ipp/jobs/CreateJob.java): `src/main/java/org/printing_factory/printing/ipp/jobs/CreateJob.java`
- [Send document](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/printing/ipp/jobs/SendDocument.java): `src/main/java/org/printing_factory/printing/ipp/jobs/SendDocument.java`
- [Job attributes](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/printing/ipp/jobs/GetJobAttributes.java): `src/main/java/org/printing_factory/printing/ipp/jobs/GetJobAttributes.java`
- [Status checker](https://github.com/todaynightt/printing-factory/blob/main/src/main/java/org/printing_factory/StatusChecker.java): `src/main/java/org/printing_factory/StatusChecker.java`

### Other components

- **Print operator**
- **Print directory**
- **IPP printer**

## Connections

- Print operator → Print directory: places files (evidence: `README.md`)
- Print directory → Local watcher: file changes (evidence: `README.md`)
- Program entry → Application setup: starts (evidence: `src/main/java/org/printing_factory/Main.java`)
- Application setup → Environment config: loads (evidence: `src/main/java/org/printing_factory/Application.java`)
- Application setup → Watch path: configures (evidence: `src/main/java/org/printing_factory/Application.java`)
- Application setup → Watcher factory: creates (evidence: `src/main/java/org/printing_factory/Application.java`)
- Watcher factory → Local watcher: selects (evidence: `src/main/java/org/printing_factory/watcher/WatcherFactory.java`)
- Application setup → Local watcher: starts watching (evidence: `src/main/java/org/printing_factory/Application.java`)
- Local watcher → File path queue: queues paths (evidence: `src/main/java/org/printing_factory/watcher/LocalWatcher.java`)
- Application setup → Job creator: starts worker (evidence: `src/main/java/org/printing_factory/Application.java`)
- Job creator → File path queue: takes paths (evidence: `src/main/java/org/printing_factory/Application.java`)
- Job creator → Document manager: prepares files (evidence: `src/main/java/org/printing_factory/JobCreator.java`)
- Document manager → File descriptor: classifies file (evidence: `src/main/java/org/printing_factory/docu/DocumentManager.java`)
- File descriptor → Filename options: parses options (evidence: `src/main/java/org/printing_factory/file/FileDescriptor.java`)
- Document manager → Document formats: checks format
- Job creator → Printer client: uses printer (evidence: `src/main/java/org/printing_factory/JobCreator.java`)
- Application setup → Printer client: configures URI (evidence: `src/main/java/org/printing_factory/Application.java`)
- Printer client → IPP connection: opens connection (evidence: `src/main/java/org/printing_factory/printing/Printer.java`)
- IPP connection → IPP printer: sends IPP requests (evidence: `src/main/java/org/printing_factory/printing/IppConnection.java`)
- Job creator → Create job: creates job (evidence: `src/main/java/org/printing_factory/JobCreator.java`)
- Create job → Send document: returns sender (evidence: `src/main/java/org/printing_factory/printing/ipp/jobs/CreateJob.java`)
- Job creator → Print job queue: enqueues jobs (evidence: `src/main/java/org/printing_factory/Application.java`)
- Application setup → Job sender: starts worker (evidence: `src/main/java/org/printing_factory/Application.java`)
- Job sender → Print job queue: takes jobs (evidence: `src/main/java/org/printing_factory/Application.java`)
- Job sender → Send document: sends document (evidence: `src/main/java/org/printing_factory/JobsSender.java`)
- Send document → IPP connection: sends request (evidence: `src/main/java/org/printing_factory/printing/ipp/jobs/SendDocument.java`)
- Send document → Job attributes: returns tracker (evidence: `src/main/java/org/printing_factory/printing/ipp/jobs/SendDocument.java`)
- Application setup → Status checker: starts worker (evidence: `src/main/java/org/printing_factory/Application.java`)
- Status checker → Job attributes: checks completion (evidence: `src/main/java/org/printing_factory/StatusChecker.java`)
- Job attributes → IPP connection: queries job (evidence: `src/main/java/org/printing_factory/printing/ipp/jobs/GetJobAttributes.java`)
