# hamza-lamjounah/spring-batch-csv-pipeline architecture

> Architecture diagram of the GitHub repository hamza-lamjounah/spring-batch-csv-pipeline, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-26). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/hamza-lamjounah/spring-batch-csv-pipeline
- Repository: https://github.com/hamza-lamjounah/spring-batch-csv-pipeline

## Overview

This Spring Batch application imports PC/PM CSV files, validates and persists records, enriches them, generates a summary report, and then exports per-file results and archives inputs. The README documents the job’s step order and listener roles; sampled source confirms reader, processor, writer, enrichment, reporting, and completion-listener behavior. Cleanup and skip-listener wiring are represented only at the documented subsystem level because their implementations and job configuration were not sampled.

Main entry points: [`src/main/java/com/dataprocessor/batch/config/BatchConfig.java`](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/config/BatchConfig.java) (Job and steps), [`src/main/java/com/dataprocessor/batch/listener/JobCompletionListener.java`](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/listener/JobCompletionListener.java) (Completion listener), [`src/main/java/com/dataprocessor/batch/step/ReportTasklet.java`](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/step/ReportTasklet.java) (Summary report), [`src/main/java/com/dataprocessor/batch/writer/RecordWriter.java`](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/writer/RecordWriter.java) (Record writer)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_runtime["Job runtime"]
  node_batchapp["Batch application"]
  node_jobconfig["Job and steps<br/>[BatchConfig.java]"]
  node_joblistener["Completion listener"]
  node_skiplistener["Skip handling"]
  node_cleanup["Final summary"]
end

subgraph group_import["CSV import"]
  node_reader["CSV reader<br/>[CsvFileReader.java]"]
  node_csvline["CSV line model<br/>[CsvLine.java]"]
  node_processor["Validation and transform<br/>[LineProcessor.java]"]
  node_writer["Record writer<br/>[RecordWriter.java]"]
end

subgraph group_processing["Enrichment and reporting"]
  node_context["Per-file results"]
  node_enrich["Record enrichment<br/>[EnrichTasklet.java]"]
  node_report["Summary report<br/>[ReportTasklet.java]"]
end

subgraph group_storage["Persistence and files"]
  node_importrepo["Import repository"]
  node_enrichedrepo["Enriched repository"]
  node_filehelper["File I/O helper"]
end

node_operator(("Application start"))
node_inputfiles["Input CSV files"]
node_database[("H2 database")]
node_outputfiles["Result and report files"]
node_archive["Input archive"]

node_operator -->|"starts"| node_batchapp
node_batchapp -->|"launches job"| node_jobconfig
node_jobconfig -->|"dispatches import"| node_reader
node_reader -->|"reads"| node_inputfiles
node_reader -->|"emits"| node_csvline
node_jobconfig -->|"dispatches import"| node_processor
node_processor -->|"valid records"| node_writer
node_jobconfig -->|"dispatches import"| node_writer
node_writer -->|"saves records"| node_importrepo
node_importrepo -->|"persists"| node_database
node_writer -->|"records successes"| node_context
node_skiplistener -->|"records rejects"| node_context
node_jobconfig -->|"then runs"| node_enrich
node_enrich -->|"reads imports"| node_importrepo
node_enrich -->|"saves enrichment"| node_enrichedrepo
node_enrichedrepo -->|"persists"| node_database
node_jobconfig -->|"then runs"| node_report
node_report -->|"counts imports"| node_importrepo
node_report -->|"counts enrichment"| node_enrichedrepo
node_report -->|"reads results"| node_context
node_report -->|"writes report"| node_filehelper
node_filehelper -->|"writes"| node_outputfiles
node_jobconfig -->|"then runs"| node_cleanup
node_jobconfig -->|"dispatches completion"| node_joblistener
node_joblistener -->|"reads results"| node_context
node_joblistener -->|"writes exports"| node_filehelper
node_joblistener -->|"archives results"| node_outputfiles
node_joblistener -->|"moves inputs"| node_archive

click node_batchapp "https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/BatchApplication.java"
click node_jobconfig "https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/config/BatchConfig.java"
click node_joblistener "https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/listener/JobCompletionListener.java"
click node_skiplistener "https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/listener/BatchSkipListener.java"
click node_cleanup "https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/step/CleanupTasklet.java"
click node_reader "https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/reader/CsvFileReader.java"
click node_csvline "https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/dto/CsvLine.java"
click node_processor "https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/processor/LineProcessor.java"
click node_writer "https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/writer/RecordWriter.java"
click node_context "https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/listener/ProcessingContext.java"
click node_enrich "https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/step/EnrichTasklet.java"
click node_report "https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/step/ReportTasklet.java"
click node_importrepo "https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/data/ImportRecordRepository.java"
click node_enrichedrepo "https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/data/EnrichedRecordRepository.java"
click node_filehelper "https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/service/FileHelperService.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_batchapp,node_jobconfig,node_joblistener,node_skiplistener,node_cleanup toneBlue
class node_reader,node_csvline,node_processor,node_writer,node_database toneAmber
class node_context,node_enrich,node_report toneMint
class node_importrepo,node_enrichedrepo,node_filehelper toneRose
class node_operator,node_inputfiles,node_outputfiles,node_archive toneIndigo
```

## Components

### Job runtime

- [Batch application](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/BatchApplication.java): `src/main/java/com/dataprocessor/batch/BatchApplication.java`
- [Job and steps](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/config/BatchConfig.java): `src/main/java/com/dataprocessor/batch/config/BatchConfig.java`
- [Completion listener](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/listener/JobCompletionListener.java): `src/main/java/com/dataprocessor/batch/listener/JobCompletionListener.java`
- [Skip handling](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/listener/BatchSkipListener.java): `src/main/java/com/dataprocessor/batch/listener/BatchSkipListener.java`
- [Final summary](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/step/CleanupTasklet.java): `src/main/java/com/dataprocessor/batch/step/CleanupTasklet.java`

### CSV import

- [CSV reader](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/reader/CsvFileReader.java): `src/main/java/com/dataprocessor/batch/reader/CsvFileReader.java`
- [CSV line model](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/dto/CsvLine.java): `src/main/java/com/dataprocessor/batch/dto/CsvLine.java`
- [Validation and transform](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/processor/LineProcessor.java): `src/main/java/com/dataprocessor/batch/processor/LineProcessor.java`
- [Record writer](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/writer/RecordWriter.java): `src/main/java/com/dataprocessor/batch/writer/RecordWriter.java`

### Enrichment and reporting

- [Per-file results](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/listener/ProcessingContext.java): `src/main/java/com/dataprocessor/batch/listener/ProcessingContext.java`
- [Record enrichment](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/step/EnrichTasklet.java): `src/main/java/com/dataprocessor/batch/step/EnrichTasklet.java`
- [Summary report](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/step/ReportTasklet.java): `src/main/java/com/dataprocessor/batch/step/ReportTasklet.java`

### Persistence and files

- [Import repository](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/data/ImportRecordRepository.java): `src/main/java/com/dataprocessor/batch/data/ImportRecordRepository.java`
- [Enriched repository](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/data/EnrichedRecordRepository.java): `src/main/java/com/dataprocessor/batch/data/EnrichedRecordRepository.java`
- [File I/O helper](https://github.com/hamza-lamjounah/spring-batch-csv-pipeline/blob/main/src/main/java/com/dataprocessor/batch/service/FileHelperService.java): `src/main/java/com/dataprocessor/batch/service/FileHelperService.java`

### Other components

- **Application start**
- **Input CSV files**
- **H2 database**
- **Result and report files**
- **Input archive**

## Connections

- Application start → Batch application: starts
- Batch application → Job and steps: launches job
- Job and steps → CSV reader: dispatches import
- CSV reader → Input CSV files: reads
- CSV reader → CSV line model: emits
- Job and steps → Validation and transform: dispatches import
- Validation and transform → Record writer: valid records
- Job and steps → Record writer: dispatches import
- Record writer → Import repository: saves records
- Import repository → H2 database: persists
- Record writer → Per-file results: records successes
- Skip handling → Per-file results: records rejects
- Job and steps → Record enrichment: then runs
- Record enrichment → Import repository: reads imports
- Record enrichment → Enriched repository: saves enrichment
- Enriched repository → H2 database: persists
- Job and steps → Summary report: then runs
- Summary report → Import repository: counts imports
- Summary report → Enriched repository: counts enrichment
- Summary report → Per-file results: reads results
- Summary report → File I/O helper: writes report
- File I/O helper → Result and report files: writes
- Job and steps → Final summary: then runs
- Job and steps → Completion listener: dispatches completion
- Completion listener → Per-file results: reads results
- Completion listener → File I/O helper: writes exports
- Completion listener → Result and report files: archives results
- Completion listener → Input archive: moves inputs
