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
5 changes: 1 addition & 4 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,7 @@ build/
!**/src/test/**/build/

### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
.idea
*.iws
*.iml
*.ipr
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/TvkQWWs6)
# Features of modern Java

# Цели и задачи л/р:
Expand Down
20 changes: 19 additions & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ plugins {
group = "org.lab"
version = "1.0-SNAPSHOT"

java {
toolchain {
languageVersion = JavaLanguageVersion.of(26)
}
}

repositories {
mavenCentral()
}
Expand All @@ -17,4 +23,16 @@ dependencies {

tasks.test {
useJUnitPlatform()
}
}

tasks.withType<JavaCompile>().configureEach {
options.compilerArgs.add("--enable-preview")
}

tasks.withType<Test>().configureEach {
jvmArgs("--enable-preview")
}

tasks.withType<JavaExec>().configureEach {
jvmArgs("--enable-preview")
}
7 changes: 5 additions & 2 deletions src/main/java/org/lab/Main.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
void main() {
IO.println("Hello and welcome!");
import org.lab.demo.DemoRunner;

void main() throws Exception {
IO.println("Starting lab demo");
DemoRunner.runDemo();
}

75 changes: 75 additions & 0 deletions src/main/java/org/lab/demo/DemoRunner.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package org.lab.demo;

import org.lab.model.*;
import org.lab.model.ids.ProjectId;
import org.lab.model.ids.TicketId;
import org.lab.model.role.ManagerRole;
import org.lab.service.DashboardService;
import org.lab.model.role.DeveloperRole;
import org.lab.model.role.TesterRole;
import org.lab.service.UserService;

import java.time.LocalDate;

public class DemoRunner {
public static void runDemo() throws Exception {
UserService users = new UserService();

var managerUser = users.register("Manager");
var devUser = users.register("Developer");
var testerUser = users.register("Tester");

var manager = new ManagerRole(managerUser);
var developer = new DeveloperRole(devUser);
var tester = new TesterRole(testerUser);

var project = new Project(
new ProjectId(1),
"Modern Java",
manager,
users
);

project.addDeveloper(manager, developer);
project.addTester(manager, tester);

var milestone = project.createMilestone(
manager,
new Milestone(
"MVP",
LocalDate.now(),
LocalDate.now().plusDays(30)
)
);

project.activateMilestone(manager, milestone);

var ticket = project.createTicket(
manager,
new Ticket(
new TicketId(100),
project,
milestone
)
);

project.assignDeveloperToTicket(manager, ticket, developer);

developer.startTicket(ticket);
developer.completeTicket(ticket);

var bug = tester.createBug(project, "UI glitch");
var fixed = developer.fixBug(bug);
var tested = tester.testBug(fixed);
var closed = tester.closeBug(tested);

IO.println("Bug final status: " + closed.status());

var dashboard = new DashboardService();
var snapshot = dashboard.snapshot(project);

IO.println("Open tickets: " + snapshot.openTickets());
IO.println("Open bugs: " + snapshot.openBugs());
}
}

26 changes: 26 additions & 0 deletions src/main/java/org/lab/model/Bug.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package org.lab.model;

import org.lab.model.ids.BugId;

public class Bug {
private final BugId id;
private final Project project;
private final String description;
private BugStatus status;

public Bug(BugId id, Project project, String description) {
this.id = id;
this.project = project;
this.description = description;
this.status = BugStatus.NEW;
}

public Bug withStatus(BugStatus newStatus) {
this.status = newStatus;
return this;
}

public BugStatus status() {
return status;
}
}
5 changes: 5 additions & 0 deletions src/main/java/org/lab/model/BugStatus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.lab.model;

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

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;

public final class Milestone {

private final String name;
private final LocalDate start;
private final LocalDate end;

private MilestoneStatus status = MilestoneStatus.OPEN;
private final List<Ticket> tickets = new ArrayList<>();

public Milestone(String name, LocalDate start, LocalDate end) {
this.name = name;
this.start = start;
this.end = end;
}

public void activate() {
status = MilestoneStatus.ACTIVE;
}

public void close() {
boolean allDone = tickets.stream()
.allMatch(t -> t.status() == TicketStatus.DONE);

if (!allDone) {
throw new IllegalStateException("Not all tickets are done");
}

status = MilestoneStatus.CLOSED;
}

public void addTicket(Ticket ticket) {
tickets.add(ticket);
}

public List<Ticket> tickets() {
return List.copyOf(tickets);
}

public MilestoneStatus status() {
return status;
}
}
5 changes: 5 additions & 0 deletions src/main/java/org/lab/model/MilestoneStatus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.lab.model;

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

import org.lab.model.ids.ProjectId;
import org.lab.model.role.*;
import org.lab.service.UserService;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public final class Project {

private final ProjectId id;
private final String name;

private final ManagerRole manager;
private TeamLeadRole teamLead;

private final Set<DeveloperRole> developers = new HashSet<>();
private final Set<TesterRole> testers = new HashSet<>();

private final List<Milestone> milestones = new ArrayList<>();
Milestone activeMilestone;

private final List<Bug> bugs = new ArrayList<>();

private final UserService userService;

public Project(ProjectId id, String name, ManagerRole manager, UserService userService) {
this.id = id;
this.name = name;
this.manager = manager;
this.userService = userService;
userService.addToProject(manager.user().id(), this);
}

public void assignTeamLead(Role actor, TeamLeadRole lead) {
switch (actor) {
case ManagerRole m -> {
this.teamLead = lead;
userService.addToProject(lead.user().id(), this);
IO.println("Manager add new teamLead to project " + id.id());
}
default -> throw new IllegalStateException("Only manager can assign team lead");
}
}

public void addDeveloper(Role actor, DeveloperRole dev) {
switch (actor) {
case ManagerRole m -> {
developers.add(dev);
userService.addToProject(dev.user().id(), this);
IO.println("Manager add new developer to project " + id.id());
}
default -> throw new IllegalStateException("Only manager can add developer");
}
}

public void addTester(Role actor, TesterRole tester) {
switch (actor) {
case ManagerRole m -> {
testers.add(tester);
userService.addToProject(tester.user().id(), this);
IO.println("Manager add new tester to project " + id.id());
}
default -> throw new IllegalStateException("Only manager can add tester");
}
}

public Milestone createMilestone(Role actor, Milestone milestone) {
switch (actor) {
case ManagerRole m -> {
milestones.add(milestone);
IO.println("Manager add new milestone to project " + id.id());
return milestone;
}
default -> throw new IllegalStateException("Only manager can create milestone");
}
}

public void activateMilestone(Role actor, Milestone milestone) {
switch (actor) {
case ManagerRole m -> {
if (activeMilestone != null) {
throw new IllegalStateException("Only one active milestone allowed");
}
milestone.activate();
activeMilestone = milestone;
IO.println("Manager change activateMilestone for project " + id.id());
}
default -> throw new IllegalStateException("Only manager can activate milestone");
}
}

public void closeMilestone(Role actor, Milestone milestone) {
switch (actor) {
case ManagerRole _ -> {
milestone.close();
activeMilestone = null;
}
default -> throw new IllegalStateException("Only manager can close milestone");
}
}

public Ticket createTicket(Role actor, Ticket ticket) {
switch (actor) {
case ManagerRole _, TeamLeadRole _ -> {
activeMilestone.addTicket(ticket);
IO.println("New ticket was added for active milestone in project " + id.id());
return ticket;
}
default -> throw new IllegalStateException("No rights to create ticket");
}
}

public void assignDeveloperToTicket(Role actor, Ticket ticket, DeveloperRole dev) {
switch (actor) {
case ManagerRole _, TeamLeadRole _ -> {
ticket.assignDeveloper(dev);
IO.println("Ticket was assigned to developer " + dev.user().name() + " in project " + id.id());
}
default -> throw new IllegalStateException("No rights");
}
}

public void addBug(Bug bug) {
bugs.add(bug);
}

public List<Bug> bugs() {
return List.copyOf(bugs);
}

public List<Milestone> milestones() {
return List.copyOf(milestones);
}
}
Loading