How vasiliy-spb/tennis_scoreboard works
Purpose and Runtime
A Java web application for creating, scoring, viewing, and persisting tennis matches. It is built with Gradle and deployed as a servlet/JSP application; the HTTP deployment descriptor is src/main/webapp/WEB-INF/web.xml. UI pages are server-rendered JSPs under src/main/webapp/WEB-INF/jsp.
Application Bootstrap and Dependency Wiring
Startup configuration initializes application-scoped dependencies, Hibernate, and optional data initialization. src/main/java/dev/chearcode/config/AppInitializer.java, src/main/java/dev/chearcode/config/ApplicationConfig.java, and src/main/java/dev/chearcode/config/ApplicationContext.java form a custom bootstrap/bean-access layer. Database settings are supplied through src/main/resources/application.properties.
HTTP Entry Points and Request Boundary
Servlets implement the user-facing workflow:
• Home: src/main/java/dev/chearcode/servlet/HomeServlet.java
• New match creation: src/main/java/dev/chearcode/servlet/NewMatchServlet.java
• Ongoing match scoring: src/main/java/dev/chearcode/servlet/MatchScoreServlet.java
• Persisted match listing: src/main/java/dev/chearcode/servlet/MatchesServlet.java
• Data initialization: src/main/java/dev/chearcode/servlet/DataInitializationServlet.java
src/main/java/dev/chearcode/servlet/BaseServlet.java supplies shared servlet behavior. JSP views such as src/main/webapp/WEB-INF/jsp/match-score.jsp consume DTO-oriented request data.
Tennis Scoring Domain
The core domain is an in-memory tennis scoring state machine. src/main/java/dev/chearcode/model/TennisMatch.java coordinates players, sets, and point progression; src/main/java/dev/chearcode/model/TennisSet.java and src/main/java/dev/chearcode/model/Game.java model normal scoring; src/main/java/dev/chearcode/model/TieBreak.java handles tie-break progression. Score-level abstractions in src/main/java/dev/chearcode/model/TennisLevel.java and src/main/java/dev/chearcode/model/CompositeTennisLevel.java separate nested score levels from match orchestration.
Ongoing-Match Lifecycle
Active matches are held outside the database through src/main/java/dev/chearcode/service/InMemoryOngoingMatchStorage.java, behind src/main/java/dev/chearcode/service/OngoingMatchStorage.java. src/main/java/dev/chearcode/service/OngoingMatchServiceImpl.java creates/retrieves active matches and advances their score based on servlet actions. This is a material boundary: active score state is process-local and will not survive application restart or scale across instances.
Persistence and Mapping
Completed or stored matches are represented by Hibernate entities src/main/java/dev/chearcode/entity/Match.java and src/main/java/dev/chearcode/entity/Player.java. src/main/java/dev/chearcode/repository/MatchRepositoryImpl.java is the database access layer, while src/main/java/dev/chearcode/service/PersistenceMatchServiceImpl.java owns persistence-facing use cases. Mapping layers translate among web DTOs, domain models, and entities, notably src/main/java/dev/chearcode/mapper/DtoModelMatchMapper.java, src/main/java/dev/chearcode/mapper/ModelEntityMatchMapper.java, and src/main/java/dev/chearcode/mapper/EntityDtoMatchMapper.java.
Cross-Cutting Boundaries
Hibernate session infrastructure is managed by src/main/java/dev/chearcode/config/HibernateManager.java; transactional request handling is centralized in src/main/java/dev/chearcode/filter/TransactionManager.java. src/main/java/dev/chearcode/filter/ExceptionHandler.java converts application failures into error responses/views. Input validation is performed before service/domain use through src/main/java/dev/chearcode/validation/MatchValidator.java and src/main/java/dev/chearcode/validation/UuidValidator.java.
Primary Flow
A user submits player details to NewMatchServlet; request DTOs are validated and mapped into TennisMatch, then stored in the in-memory active-match service. Score actions reach MatchScoreServlet, which updates the domain scoring hierarchy. Match data is mapped for match-score.jsp; completed or explicitly saved matches flow through persistence services/repositories to Hibernate-backed storage. MatchesServlet retrieves persisted match DTOs, with pagination support via src/main/java/dev/chearcode/util/PaginationHelper.java.
Main entry points: NewMatchServlet.java Workflow servlets · PersistenceMatchServiceImpl.java Persistence match service · OngoingMatchServiceImpl.java Ongoing match service · MatchRepositoryImpl.java Match repository
Components 22
Web request layer
- Servlet deployment
src/main/webapp/WEB-INF/web.xml - Workflow servlets · Home, creation, scoring, listing, and data initialization endpoints.
src/main/java/dev/chearcode/servlet/NewMatchServlet.java - Request validation
src/main/java/dev/chearcode/validation/MatchValidator.java - JSP views · Views consume DTO-oriented request data.
src/main/webapp/WEB-INF/jsp/match-score.jsp
Active scoring
Active match state is process-local.
- Ongoing match service · Creates, retrieves, and advances active matches.
src/main/java/dev/chearcode/service/OngoingMatchServiceImpl.java - Active match storage · State does not survive restart or span application instances.
src/main/java/dev/chearcode/service/InMemoryOngoingMatchStorage.java - Tennis match
src/main/java/dev/chearcode/model/TennisMatch.java - Set and game scoring
src/main/java/dev/chearcode/model/TennisSet.java - Tie-break scoring
src/main/java/dev/chearcode/model/TieBreak.java - DTO-to-domain mapper
src/main/java/dev/chearcode/mapper/DtoModelMatchMapper.java
Persistence
- Persistence match service · Owns saved-match use cases.
src/main/java/dev/chearcode/service/PersistenceMatchServiceImpl.java - Domain-to-entity mapper
src/main/java/dev/chearcode/mapper/ModelEntityMatchMapper.java - Entity-to-DTO mapper
src/main/java/dev/chearcode/mapper/EntityDtoMatchMapper.java - Match repository
src/main/java/dev/chearcode/repository/MatchRepositoryImpl.java - Match and player entities
src/main/java/dev/chearcode/entity/Match.java - Match database
Bootstrap and infrastructure
- Application bootstrap · Initializes application dependencies and optional data.
src/main/java/dev/chearcode/config/AppInitializer.java - Application context
src/main/java/dev/chearcode/config/ApplicationContext.java - Hibernate manager
src/main/java/dev/chearcode/config/HibernateManager.java - Database settings
src/main/resources/application.properties - Transaction manager · Centralizes transactional request handling.
src/main/java/dev/chearcode/filter/TransactionManager.java - Exception handler · Converts failures into error responses or views.
src/main/java/dev/chearcode/filter/ExceptionHandler.java
Connections 25
- Servlet deployment → Workflow servlets: routes requests
- Servlet deployment → Transaction manager: installs filter
- Servlet deployment → Exception handler: installs filter
- Workflow servlets → Request validation: validates input
- Workflow servlets → DTO-to-domain mapper: maps creation DTOs
- DTO-to-domain mapper → Ongoing match service: creates active match
- Workflow servlets → Ongoing match service: scores and retrieves
- Ongoing match service → Active match storage: stores active state
- Ongoing match service → Tennis match: advances
- Tennis match → Set and game scoring: coordinates
- Set and game scoring → Tie-break scoring: uses when required
- Workflow servlets → JSP views: renders DTOs
- Workflow servlets → Persistence match service: saves and lists matches
- Persistence match service → Domain-to-entity mapper: maps for save
- Persistence match service → Entity-to-DTO mapper: maps for views
- Domain-to-entity mapper → Match and player entities: produces
- Match repository → Match and player entities: persists
- Persistence match service → Match repository: uses
- Match repository → Match database: reads and writes
- Application bootstrap → Application context: initializes
- Application bootstrap → Hibernate manager: initializes
- Database settings → Hibernate manager: configures
- Transaction manager → Hibernate manager: manages sessions
- Hibernate manager → Match repository: provides sessions
- Exception handler → JSP views: renders failures