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
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
21 changes: 21 additions & 0 deletions 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,19 @@ dependencies {

tasks.test {
useJUnitPlatform()
}

// 2. Включаем preview-фичи для компиляции
tasks.withType<JavaCompile>().configureEach {
options.compilerArgs.add("--enable-preview")
}

// 3. Включаем preview-фичи для запуска тестов
tasks.withType<Test>().configureEach {
jvmArgs("--enable-preview")
}

// 4. Включаем preview-фичи для запуска приложения через run
tasks.withType<JavaExec>().configureEach {
jvmArgs("--enable-preview")
}
38 changes: 37 additions & 1 deletion src/main/java/org/lab/Main.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,40 @@
import org.lab.model.bug.Bug;
import org.lab.model.bug.BugStatus;
import org.lab.model.milestone.MilestoneStatus;
import org.lab.model.users.Developer;
import org.lab.model.users.Manager;

import java.util.Date;

void main() {
IO.println("Hello and welcome!");
Manager manager = new Manager("Manager");
var project = manager.createProject("Lab 4");
IO.println("Manager " + manager.getName() + " create project " + project.getName());

var developer = new Developer("Backend");
manager.addDeveloper(project, developer);

var milestone = manager.createMilestone("MVP", new Date(), project);
manager.setMilestoneStatus(milestone, MilestoneStatus.ACTIVE);

var _ = manager.createTicket("Do backend", project, milestone, developer);

var bug = developer.createBug(project, "can't start backend");
var newBug = new Bug("can't start backend", project, BugStatus.NEW);
IO.println(bug == newBug);

Bug[] bugs = new Bug[2];
bugs[0] = bug;
bugs[1] = newBug;

var fixedBug = developer.resolveBug();
IO.println(bug == fixedBug);
IO.println(developer.getFirstBug() == fixedBug);
IO.println(developer.getFirstBug() == bug);

Object[] closedBugs = Arrays.stream(bugs).map(Bug::withFixed).map(Bug::withTested).map(Bug::withClosed).toArray();
IO.println(closedBugs[0] == closedBugs[1]);

var _ = new Developer("python backend");
}

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

public value class Point {
private final double x;
private final double y;

public Point(double x, double y) {
this.x = x;
this.y = y;
}

public double x() { return x; }
public double y() { return y; }

public Point withX(double newX) {
return new Point(newX, this.y);
}

public Point withY(double newY) {
return new Point(this.x, newY);
}
}
25 changes: 25 additions & 0 deletions src/main/java/org/lab/model/bug/Bug.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package org.lab.model.bug;

import org.lab.model.project.Project;

public value record Bug(String name, Project project, BugStatus status) {
public Bug(String name, Project project) {
this(name, project, BugStatus.NEW);
}

public Bug withProject(Project project) {
return new Bug(this.name, project, this.status);
}

public Bug withFixed() {
return new Bug(this.name, this.project, BugStatus.FIXED);
}

public Bug withTested() {
return new Bug(this.name, this.project, BugStatus.FIXED);
}

public Bug withClosed() {
return new Bug(this.name, this.project, BugStatus.CLOSED);
}
}
8 changes: 8 additions & 0 deletions src/main/java/org/lab/model/bug/BugStatus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.lab.model.bug;

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

import org.lab.model.project.Project;
import org.lab.model.ticket.Ticket;

import java.util.ArrayList;
import java.util.Date;
import java.util.SequencedCollection;

public class Milestone {
private final String name;
private final Date date;
private final Project project;
private final SequencedCollection<Ticket> tickets = new ArrayList<>();
private MilestoneStatus status = MilestoneStatus.OPEN;

public Milestone(String name, Date date, Project project) {
this.name = name;
this.date = date;
this.project = project;
}

public void setStatus(MilestoneStatus status) {
this.status = status;
}

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

public SequencedCollection<Ticket> getTickets() {
return this.tickets;
}

public Date getDate() {
return date;
}

public Project getProject() {
return project;
}

public MilestoneStatus getStatus() {
return status;
}

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

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

import org.lab.model.bug.Bug;
import org.lab.model.milestone.Milestone;
import org.lab.model.users.*;

import java.util.*;

public class Project {
String name;
Leader leader;
Manager manager;
List<Developer> developers = new ArrayList<>();
List<Tester> testers = new ArrayList<>();

List<Milestone> milestones = new ArrayList<>();
SequencedCollection<Bug> bugs = new ArrayList<>();

public Project(String name) {
this.name = name;
}

public void addManager(Manager manager) {
if (this.manager != null) {
this.removeUser(manager);
}
this.manager = manager;
manager.addProject(this);
}

public void removeUser(User user) {
StringBuilder sb = new StringBuilder();
sb.append("Remove ");
switch (user) {
case Developer developer -> {
this.developers.remove(developer);
developer.removeProject(this);
sb.append("developer ").append(developer.getName());
}
case Tester tester -> {
this.testers.remove(tester);
tester.removeProject(this);
sb.append("tester ").append(tester.getName());
}
case Manager manager -> {
this.manager = null;
manager.removeProject(this);
sb.append("manager ").append(manager.getName());
}
case Leader leader -> {
this.leader = null;
leader.removeProject(this);
sb.append("leader ").append(leader.getName());
}
default -> throw new IllegalStateException("Unexpected value: " + user);
}
sb.append(" from project ").append(this.getName());
String result = sb.toString();
System.out.println(result);
}

public void addUser(User user) {
StringBuilder sb = new StringBuilder();
sb.append("Add ");
switch (user) {
case Developer developer -> {
this.developers.add(developer);
developer.addProject(this);
sb.append("developer ").append(developer.getName());
}
case Tester tester -> {
this.testers.add(tester);
tester.addProject(this);
sb.append("tester ").append(tester.getName());
}
case Manager manager -> {
if (this.manager != null) {
this.removeUser(manager);
}
this.manager = manager;
manager.addProject(this);
sb.append("manager ").append(manager.getName());
}
case Leader leader -> {
if (this.leader != null) {
this.removeUser(this.leader);
}
this.leader = leader;
leader.addProject(this);
sb.append("leader ").append(leader.getName());
}
default -> throw new IllegalStateException("Unexpected value: " + user);
}
sb.append(" to project ").append(this.getName());
String result = sb.toString();
System.out.println(result);
}

public void addMilestone(Milestone milestone) {
this.milestones.add(milestone);
}

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

public boolean isManager(Manager manager) {
return this.manager == manager;
}

public String getName() {
return this.name;
}
}
11 changes: 11 additions & 0 deletions src/main/java/org/lab/model/ticket/Ticket.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package org.lab.model.ticket;

import org.lab.model.milestone.Milestone;
import org.lab.model.project.Project;
import org.lab.model.users.Developer;

public record Ticket(String name, Project project, Developer developer, Milestone milestone, TicketStatus status) {
public Ticket(String name, Project project, Developer developer, Milestone milestone) {
this(name, project, developer, milestone, TicketStatus.NEW);
}
}
8 changes: 8 additions & 0 deletions src/main/java/org/lab/model/ticket/TicketStatus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.lab.model.ticket;

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

import org.lab.model.bug.Bug;
import org.lab.model.project.Project;

public final class Developer extends User {
public Developer(String name) {
if (name.contains("python")) throw new IllegalArgumentException("we can't create python developers");
super(name);
}

public Bug createBug(Project project, String name) {
var bug = new Bug(name, project);
project.addBug(bug);
this.bugs.addLast(bug);
return bug;
}

public Bug resolveBug() {
var bug = this.bugs.getFirst();
bug = bug.withFixed();
this.bugs.removeFirst();
this.bugs.addFirst(bug);
return bug;
}
}
7 changes: 7 additions & 0 deletions src/main/java/org/lab/model/users/Leader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package org.lab.model.users;

public final class Leader extends User {
public Leader(String name) {
super(name);
}
}
Loading