Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -39,4 +39,5 @@ bin/
.vscode/

### Mac OS ###
.DS_Store
.DS_Store
/.idea/
14 changes: 7 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/TvkQWWs6)
# Features of modern Java

# Цели и задачи л/р:
На основе индивидуального задания произвести разработку бизнес-логики бэкэнда entriprise-системы.

В ходе реализации необходимо использовать возможности современных версий языка Java:
* Pattern matching для switch
* строковые шаблоны))))))))))))))
* расширенные возможности стандартной библиотеки Java
* sealed классы и record
* программирование в функциональном стиле
* preview как project Valhalla, structured concurrency...
* и т.д.
* Pattern matching для switch - TicketService.getTaskDescription()
* sealed классы - Task, Ticket, BugReport
* record - ManagementSystem
* программирование в функциональном стиле - Stream API и лямбды
* preview как structured concurrency - BugReportService.findBugReportsToFix()
* compact source files

# Обязательное условие:
* Использование системы сборки Gradle
Expand Down
14 changes: 14 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,26 @@ repositories {
mavenCentral()
}

java {
sourceCompatibility = JavaVersion.VERSION_25
targetCompatibility = JavaVersion.VERSION_25
}


dependencies {
implementation("org.projectlombok:lombok:1.18.42")
compileOnly("org.projectlombok:lombok:1.18.42")
annotationProcessor("org.projectlombok:lombok:1.18.42")
testImplementation(platform("org.junit:junit-bom:5.10.0"))
testImplementation("org.junit.jupiter:junit-jupiter")
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
}

tasks.withType<JavaCompile> {
options.compilerArgs.add("--enable-preview")
options.compilerArgs.add("-parameters")
}
tasks.test {
useJUnitPlatform()
jvmArgs("--enable-preview")
}
95 changes: 93 additions & 2 deletions src/main/java/org/lab/Main.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,95 @@
import org.lab.ManagementSystem;
import org.lab.model.BugReport;
import org.lab.model.Milestone;
import org.lab.model.MilestoneStatus;
import org.lab.model.Project;
import org.lab.model.Ticket;
import org.lab.model.User;
import org.lab.service.BugReportService;
import org.lab.service.MilestoneService;
import org.lab.service.ProjectService;
import org.lab.service.TicketService;
import org.lab.service.UserService;

void main() {
IO.println("Hello and welcome!");
}
ManagementSystem system = ManagementSystem.defaults();

UserService userService = system.userService();
ProjectService projectService = system.projectService();
BugReportService bugReportService = system.bugReportService();
MilestoneService milestoneService = system.milestoneService();
TicketService ticketService = system.ticketService();

User manager = userService.registerUser("manager", "m");
System.out.println("Registered manager: " + manager);

User developer1 = userService.registerUser("developer1", "d");
System.out.println("Registered developer1: " + developer1);

User developer2 = userService.registerUser("developer2", "d");
System.out.println("Registered developer2: " + developer2);

User tester = userService.registerUser("tester", "t");
System.out.println("Registered tester: " + tester);

User teamLead = userService.registerUser("teamLead", "t");
System.out.println("Registered teamLead: " + teamLead);

Project project = projectService.createProject(manager);
System.out.println("Created project: " + project);

projectService.assignTeamLeader(manager, project.getId(), teamLead);
System.out.println("Assigned team leader to project");

projectService.addDeveloperToProject(manager, project.getId(), developer1);
System.out.println("Added developer1 to project");

projectService.addDeveloperToProject(manager, project.getId(), developer2);
System.out.println("Added developer2 to project");

projectService.addTesterToProject(manager, project.getId(), tester);
System.out.println("Added tester to project");

Milestone milestone = milestoneService.createMilestone(
manager,
LocalDate.now(),
LocalDate.now().plusDays(2),
project
);
System.out.println("Created milestone: " + milestone);

milestoneService.changeMilestoneStatus(manager, project.getId(), milestone.getId(), MilestoneStatus.ACTIVE);
System.out.println("Changed milestone status to ACTIVE " + milestone);

Ticket ticket = ticketService.createTicketForProject(teamLead, milestone.getId());
System.out.println("Created ticket: " + ticket);

ticketService.assignDeveloperToTicket(manager, ticket.getId(), developer2);
System.out.println("Assigned developer2 to ticket");

ticketService.executeTicket(developer2, ticket.getId());
System.out.println("Executed ticket (first time)");

ticketService.executeTicket(developer2, ticket.getId());
System.out.println("Executed ticket (second time)");

boolean ticketCompletion = ticketService.checkTicketCompletion(teamLead, ticket.getId());
System.out.println("Ticket completion status: " + ticketCompletion);

BugReport bugReport = bugReportService.testProject(tester, project.getId());
System.out.println("Created bug report from testing: " + bugReport);

Set<BugReport> fixedBugReports = bugReportService.findBugReportsToFix(developer1).stream()
.map(bug -> bugReportService.fixBugReport(developer1, bug.getId()))
.collect(Collectors.toSet());
System.out.println("Fixed bug reports: " + fixedBugReports);

Stream<BugReport> verifiedReports = fixedBugReports.stream()
.map(report -> bugReportService.verifyBugFix(tester, report.getId(), true));
System.out.println("Verifying bug reports...");

verifiedReports.forEach(report -> {
bugReportService.closeBugReport(manager, report.getId());
System.out.println("Closed bug report: " + report);
});
}
64 changes: 64 additions & 0 deletions src/main/java/org/lab/ManagementSystem.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package org.lab;

import org.lab.repository.BugReportRepository;
import org.lab.repository.MilestoneRepository;
import org.lab.repository.ProjectRepository;
import org.lab.repository.TicketRepository;
import org.lab.repository.UserRepository;
import org.lab.service.BugReportService;
import org.lab.service.MilestoneService;
import org.lab.service.ProjectService;
import org.lab.service.TicketService;
import org.lab.service.UserRoleValidationService;
import org.lab.service.UserService;

public record ManagementSystem(
BugReportService bugReportService,
MilestoneService milestoneService,
ProjectService projectService,
TicketService ticketService,
UserService userService,
UserRoleValidationService userRoleValidationService
) {
public static ManagementSystem defaults() {
BugReportRepository bugReportRepository = new BugReportRepository();
MilestoneRepository milestoneRepository = new MilestoneRepository();
ProjectRepository projectRepository = new ProjectRepository();
TicketRepository ticketRepository = new TicketRepository();
UserRepository userRepository = new UserRepository();

UserRoleValidationService userRoleValidationService = new UserRoleValidationService(projectRepository);

ProjectService projectService = new ProjectService(
projectRepository,
userRoleValidationService
);
MilestoneService milestoneService = new MilestoneService(
milestoneRepository,
projectService,
ticketRepository,
userRoleValidationService
);
return new ManagementSystem(
new BugReportService(
bugReportRepository,
projectRepository,
userRoleValidationService
),
milestoneService,
projectService,
new TicketService(
ticketRepository,
projectService,
milestoneService,
userRoleValidationService
),
new UserService(
userRepository,
projectRepository,
ticketRepository
),
userRoleValidationService
);
}
}
14 changes: 14 additions & 0 deletions src/main/java/org/lab/model/BugReport.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.lab.model;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public final class BugReport implements Task {
private Long id;
private long projectId;
private BugReportStatus status;
}
8 changes: 8 additions & 0 deletions src/main/java/org/lab/model/BugReportStatus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.lab.model;

public enum BugReportStatus {
NEW,
FIXED,
TESTED,
CLOSED,
}
19 changes: 19 additions & 0 deletions src/main/java/org/lab/model/Milestone.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.lab.model;

import java.time.LocalDate;
import java.util.Set;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class Milestone {
private Long id;
private MilestoneStatus status;
private LocalDate startDate;
private LocalDate endDate;
private Set<Ticket> tickets;
}
7 changes: 7 additions & 0 deletions src/main/java/org/lab/model/MilestoneStatus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.lab.model;

public enum MilestoneStatus {
OPEN,
ACTIVE,
CLOSED,
}
19 changes: 19 additions & 0 deletions src/main/java/org/lab/model/Project.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package org.lab.model;

import java.util.Set;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public class Project {
private Long id;
private Set<User> developers;
private Set<User> testers;
private User manager;
private User teamLeader;
private Set<Milestone> milestones;
}
8 changes: 8 additions & 0 deletions src/main/java/org/lab/model/Role.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.lab.model;

public enum Role {
MANAGER,
TEAMLEAD,
DEVELOPER,
QA,
}
5 changes: 5 additions & 0 deletions src/main/java/org/lab/model/Task.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.lab.model;

public sealed interface Task permits Ticket, BugReport {
Long getId();
}
17 changes: 17 additions & 0 deletions src/main/java/org/lab/model/Ticket.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.lab.model;

import java.util.Set;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
public final class Ticket implements Task {
private Long id;
private long milestoneId;
private TicketStatus status;
private Set<User> assignees;
}
8 changes: 8 additions & 0 deletions src/main/java/org/lab/model/TicketStatus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.lab.model;

public enum TicketStatus {
NEW,
ACCEPTED,
IN_PROGRESS,
COMPLETED,
}
16 changes: 16 additions & 0 deletions src/main/java/org/lab/model/User.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package org.lab.model;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
@RequiredArgsConstructor
public class User {
private Long id;
private String login;
private String password;
}
34 changes: 34 additions & 0 deletions src/main/java/org/lab/repository/BugReportRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package org.lab.repository;

import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
import java.util.List;
import java.util.stream.Collectors;

import org.lab.model.BugReport;

public class BugReportRepository {
private final Map<Long, BugReport> bugReports = new ConcurrentHashMap<>();
private final AtomicLong idGenerator = new AtomicLong(1);

public BugReport save(BugReport bugReport) {
if (bugReport.getId() == null) {
bugReport.setId(idGenerator.getAndIncrement());
}
bugReports.put(bugReport.getId(), bugReport);
return bugReport;
}

public Optional<BugReport> findById(Long id) {
return Optional.ofNullable(bugReports.get(id));
}

public List<BugReport> findByProjectId(Long projectId) {
return bugReports.values().stream()
.filter(bugReport -> Objects.equals(bugReport.getProjectId(), projectId))
.collect(Collectors.toList());
}
}
Loading