diff --git a/agiledancers-be/pom.xml b/agiledancers-be/pom.xml
index 477cbba..26611a6 100644
--- a/agiledancers-be/pom.xml
+++ b/agiledancers-be/pom.xml
@@ -18,6 +18,19 @@
com.google.ortools
ortools-java
+
+
+
+ net.datafaker
+ datafaker
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ test
+
\ No newline at end of file
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/Main.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/Main.java
deleted file mode 100644
index 00ddbb4..0000000
--- a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/Main.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package nl.agilecc.agiledancers;
-
-//TIP To Run code, press or
-// click the icon in the gutter.
-public class Main {
- public static void main(String[] args) {
- //TIP Press with your caret at the highlighted text
- // to see how IntelliJ IDEA suggests fixing it.
- System.out.printf("Hello and welcome!");
-
- for (int i = 1; i <= 5; i++) {
- //TIP Press to start debugging your code. We have set one breakpoint
- // for you, but you can always add more by pressing .
- System.out.println("i = " + i);
- }
- }
-}
\ No newline at end of file
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/AbstractEntity.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/AbstractEntity.java
new file mode 100644
index 0000000..3a08a0e
--- /dev/null
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/AbstractEntity.java
@@ -0,0 +1,30 @@
+package nl.agilecc.agiledancers.model;
+
+import lombok.*;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+
+@Getter
+@Setter
+@EqualsAndHashCode
+@ToString
+@NoArgsConstructor
+public abstract class AbstractEntity {
+ private Long id;
+
+ protected void addNullSafe(Set set, T t) {
+ emptyIfNull(set).add(t);
+ }
+
+ private Set emptyIfNull(Set set) {
+ return set == null ?
+ new HashSet<>() :
+ set;
+ }
+
+ protected Set unmodifiableNullSafe(Set set) {
+ return set == null ? Collections.emptySet() : Collections.unmodifiableSet(set);
+ }
+}
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Coach.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Coach.java
index f008c3c..326b14c 100644
--- a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Coach.java
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Coach.java
@@ -1,6 +1,12 @@
package nl.agilecc.agiledancers.model;
-public class Coach {
- private Long id;
- private String name;
+import lombok.*;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@Builder
+@ToString(onlyExplicitlyIncluded = true)
+public class Coach extends AbstractEntity {
+ @ToString.Include
+ private final String name;
}
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DanceGroup.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DanceGroup.java
index 5914190..c81a203 100644
--- a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DanceGroup.java
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DanceGroup.java
@@ -1,17 +1,46 @@
package nl.agilecc.agiledancers.model;
+import lombok.*;
import nl.agilecc.agiledancers.model.specifications.DanceGroupStyle;
import nl.agilecc.agiledancers.model.specifications.DanceGroupType;
+import java.util.Collections;
+import java.util.HashSet;
import java.util.Set;
-public class DanceGroup {
- private Long id;
- private String category;
- private DanceGroupType type;
- private int startAge;
- private int endAge;
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@Builder
+@ToString(onlyExplicitlyIncluded = true)
+public class DanceGroup extends AbstractEntity {
+ @ToString.Include
+ private final String category;
+ @ToString.Include
+ private final DanceGroupType type;
+ @ToString.Include
+ private final int startAge;
+ @ToString.Include
+ private final int endAge;
+ @ToString.Include
private Set dancers;
+ @ToString.Include
private Set styles;
+ @ToString.Include
private Coach coach;
+
+ public Set getDancers() {
+ return super.unmodifiableNullSafe(dancers);
+ }
+
+ public void addDancer(Dancer dancer) {
+ super.addNullSafe(dancers, dancer);
+ }
+
+ public Set getStyles() {
+ return super.unmodifiableNullSafe(styles);
+ }
+
+ public void addStyle(DanceGroupStyle style) {
+ super.addNullSafe(styles, style);
+ }
}
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DanceSchool.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DanceSchool.java
new file mode 100644
index 0000000..63803d7
--- /dev/null
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DanceSchool.java
@@ -0,0 +1,50 @@
+package nl.agilecc.agiledancers.model;
+
+import lombok.*;
+
+import java.util.Collections;
+import java.util.Set;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@Builder
+@ToString(onlyExplicitlyIncluded = true)
+public class DanceSchool extends AbstractEntity {
+ private final String name;
+ private final Set dancers;
+ private final Set danceGroups;
+ private final Set shows;
+ private final Set coaches;
+
+ public Set getDancers() {
+ return super.unmodifiableNullSafe(dancers);
+ }
+
+ public Set getDanceGroups() {
+ return super.unmodifiableNullSafe(danceGroups);
+ }
+
+ public Set getShows() {
+ return super.unmodifiableNullSafe(shows);
+ }
+
+ public Set getCoaches() {
+ return super.unmodifiableNullSafe(coaches);
+ }
+
+ public void addDancer(Dancer dancer) {
+ super.addNullSafe(dancers, dancer);
+ }
+
+ public void addDanceGroup(DanceGroup danceGroup) {
+ super.addNullSafe(danceGroups, danceGroup);
+ }
+
+ public void addShow(Show show) {
+ super.addNullSafe(shows, show);
+ }
+
+ public void addCoach(Coach coach) {
+ super.addNullSafe(coaches, coach);
+ }
+}
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Dancer.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Dancer.java
index 5b3dfec..a628a44 100644
--- a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Dancer.java
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Dancer.java
@@ -1,7 +1,21 @@
package nl.agilecc.agiledancers.model;
-public class Dancer {
- private Long id;
- private String name;
- private int age;
+import lombok.*;
+
+import java.time.LocalDate;
+import java.time.Period;
+
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@Builder
+@ToString(onlyExplicitlyIncluded = true)
+public class Dancer extends AbstractEntity {
+ @ToString.Include
+ private final String name;
+ @ToString.Include
+ private LocalDate birthDate;
+
+ public int age() {
+ return Period.between(birthDate, LocalDate.now()).getYears();
+ }
}
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DayPart.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DayPart.java
index ba068f5..6503d82 100644
--- a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DayPart.java
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/DayPart.java
@@ -1,12 +1,17 @@
package nl.agilecc.agiledancers.model;
+import lombok.*;
import nl.agilecc.agiledancers.model.specifications.DayPartType;
import java.util.List;
-public class DayPart {
- private Long id;
-
- private DayPartType type;
- private List danceGroups;
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@Builder
+@ToString(onlyExplicitlyIncluded = true)
+public class DayPart extends AbstractEntity {
+ @ToString.Include
+ private final DayPartType type;
+ @ToString.Include
+ private final List danceGroups;
}
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Show.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Show.java
index b23a772..de61f10 100644
--- a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Show.java
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/model/Show.java
@@ -1,8 +1,14 @@
package nl.agilecc.agiledancers.model;
+import lombok.*;
+
import java.util.List;
-public class Show {
- private Long id;
- private List dayParts;
+@Getter
+@AllArgsConstructor(access = AccessLevel.PRIVATE)
+@Builder
+@ToString(onlyExplicitlyIncluded = true)
+public class Show extends AbstractEntity {
+ @ToString.Include
+ private final List dayParts;
}
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/AbstractRepository.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/AbstractRepository.java
new file mode 100644
index 0000000..0468b13
--- /dev/null
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/AbstractRepository.java
@@ -0,0 +1,27 @@
+package nl.agilecc.agiledancers.repository;
+
+import nl.agilecc.agiledancers.model.AbstractEntity;
+
+import java.util.*;
+
+public abstract class AbstractRepository {
+ private long sequence = 0L;
+
+ protected Map entities = new LinkedHashMap<>();
+
+ public T add(T entity) {
+ if (entity.getId() == null) {
+ entity.setId(sequence++);
+ }
+ entities.put(entity.getId(), entity);
+ return entity;
+ }
+
+ public List findAll() {
+ return List.copyOf(entities.values());
+ }
+
+ public T findById(long id) {
+ return entities.get(id);
+ }
+}
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/CoachRepository.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/CoachRepository.java
new file mode 100644
index 0000000..2257e5c
--- /dev/null
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/CoachRepository.java
@@ -0,0 +1,7 @@
+package nl.agilecc.agiledancers.repository;
+
+import nl.agilecc.agiledancers.model.Coach;
+
+public class CoachRepository extends AbstractRepository {
+
+}
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DanceGroupRepository.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DanceGroupRepository.java
new file mode 100644
index 0000000..57f4ed2
--- /dev/null
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DanceGroupRepository.java
@@ -0,0 +1,6 @@
+package nl.agilecc.agiledancers.repository;
+
+import nl.agilecc.agiledancers.model.DanceGroup;
+
+public class DanceGroupRepository extends AbstractRepository {
+}
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DanceSchoolRepository.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DanceSchoolRepository.java
new file mode 100644
index 0000000..de5ce27
--- /dev/null
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DanceSchoolRepository.java
@@ -0,0 +1,6 @@
+package nl.agilecc.agiledancers.repository;
+
+import nl.agilecc.agiledancers.model.DanceSchool;
+
+public class DanceSchoolRepository extends AbstractRepository {
+}
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DancerRepository.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DancerRepository.java
new file mode 100644
index 0000000..98cf1f3
--- /dev/null
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DancerRepository.java
@@ -0,0 +1,6 @@
+package nl.agilecc.agiledancers.repository;
+
+import nl.agilecc.agiledancers.model.Dancer;
+
+public class DancerRepository extends AbstractRepository {
+}
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DayPartRepository.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DayPartRepository.java
new file mode 100644
index 0000000..5d0a703
--- /dev/null
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/DayPartRepository.java
@@ -0,0 +1,6 @@
+package nl.agilecc.agiledancers.repository;
+
+import nl.agilecc.agiledancers.model.DayPart;
+
+public class DayPartRepository extends AbstractRepository {
+}
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/ShowRepository.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/ShowRepository.java
new file mode 100644
index 0000000..4e96e32
--- /dev/null
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/repository/ShowRepository.java
@@ -0,0 +1,6 @@
+package nl.agilecc.agiledancers.repository;
+
+import nl.agilecc.agiledancers.model.Show;
+
+public class ShowRepository extends AbstractRepository {
+}
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/CoachService.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/CoachService.java
new file mode 100644
index 0000000..457ae29
--- /dev/null
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/CoachService.java
@@ -0,0 +1,12 @@
+package nl.agilecc.agiledancers.service;
+
+import nl.agilecc.agiledancers.model.Coach;
+import nl.agilecc.agiledancers.repository.CoachRepository;
+
+public class CoachService {
+ private CoachRepository coachRepository = new CoachRepository();
+
+ public Coach addCoach(String name, Coach coach) {
+ return coachRepository.add(Coach.builder().name(name).build());
+ }
+}
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DanceGroupService.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DanceGroupService.java
new file mode 100644
index 0000000..a201877
--- /dev/null
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DanceGroupService.java
@@ -0,0 +1,27 @@
+package nl.agilecc.agiledancers.service;
+
+import nl.agilecc.agiledancers.model.Coach;
+import nl.agilecc.agiledancers.model.DanceGroup;
+import nl.agilecc.agiledancers.model.Dancer;
+import nl.agilecc.agiledancers.model.specifications.DanceGroupStyle;
+import nl.agilecc.agiledancers.model.specifications.DanceGroupType;
+import nl.agilecc.agiledancers.repository.DanceGroupRepository;
+
+import java.util.Set;
+
+public class DanceGroupService {
+ private final DanceGroupRepository danceGroupRepository = new DanceGroupRepository();
+
+ public DanceGroup add(String category, DanceGroupType type, int startAge, int endAge, Set dancers, Set styles, Coach coach) {
+ DanceGroup danceGroup = DanceGroup.builder()
+ .category(category)
+ .type(type)
+ .startAge(startAge)
+ .endAge(endAge)
+ .dancers(dancers)
+ .styles(styles)
+ .coach(coach).build();
+
+ return danceGroupRepository.add(danceGroup);
+ }
+}
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DanceSchoolService.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DanceSchoolService.java
new file mode 100644
index 0000000..a300d0d
--- /dev/null
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DanceSchoolService.java
@@ -0,0 +1,29 @@
+package nl.agilecc.agiledancers.service;
+
+import nl.agilecc.agiledancers.model.*;
+import nl.agilecc.agiledancers.repository.DanceSchoolRepository;
+
+public class DanceSchoolService {
+ private final DanceSchoolRepository danceSchoolRepository = new DanceSchoolRepository();
+
+ public DanceSchool add(String name) {
+ DanceSchool danceSchool = DanceSchool.builder().name(name).build();
+ return danceSchoolRepository.add(danceSchool);
+ }
+
+ public void addDancer(Long danceSchoolId, Dancer dancer) {
+ danceSchoolRepository.findById(danceSchoolId).addDancer(dancer);
+ }
+
+ public void addDanceGroup(Long danceSchoolId, DanceGroup danceGroup) {
+ danceSchoolRepository.findById(danceSchoolId).addDanceGroup(danceGroup);
+ }
+
+ public void addCoach(Long danceSchoolId, Coach coach) {
+ danceSchoolRepository.findById(danceSchoolId).addCoach(coach);
+ }
+
+ public void addShow(Long danceSchoolId, Show show) {
+ danceSchoolRepository.findById(danceSchoolId).addShow(show);
+ }
+}
diff --git a/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DancerService.java b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DancerService.java
new file mode 100644
index 0000000..7898505
--- /dev/null
+++ b/agiledancers-be/src/main/java/nl/agilecc/agiledancers/service/DancerService.java
@@ -0,0 +1,15 @@
+package nl.agilecc.agiledancers.service;
+
+import nl.agilecc.agiledancers.model.Dancer;
+import nl.agilecc.agiledancers.repository.DancerRepository;
+
+import java.time.LocalDate;
+
+public class DancerService {
+ private final DancerRepository dancerRepository = new DancerRepository();
+
+ public Dancer addDancer(String name, LocalDate birthDate) {
+ Dancer dancer = Dancer.builder().name(name).birthDate(birthDate).build();
+ return dancerRepository.add(dancer);
+ }
+}
diff --git a/agiledancers-be/src/test/java/sit/DanceSchoolSit.java b/agiledancers-be/src/test/java/sit/DanceSchoolSit.java
new file mode 100644
index 0000000..6d09bfa
--- /dev/null
+++ b/agiledancers-be/src/test/java/sit/DanceSchoolSit.java
@@ -0,0 +1,26 @@
+package sit;
+
+import net.datafaker.Faker;
+import nl.agilecc.agiledancers.model.DanceSchool;
+import nl.agilecc.agiledancers.service.DanceSchoolService;
+import org.junit.jupiter.api.Test;
+
+class DanceSchoolSit {
+ Faker faker = new Faker();
+ int numberOfDanceGroups = 42;
+
+ int aantalDansersTm5 = 10;
+ int aantalDansers6tm10 = 30;
+ int aantalDansers11tot14 = 70;
+ int aantalDansers14tm17 = 140;
+ int aantalDansers18Plus = 100;
+
+ private DanceSchoolService danceSchoolService = new DanceSchoolService();
+
+ @Test
+ void testDanceSchoolModel() {
+ DanceSchool danceSchool = danceSchoolService.add("24 Dance Studio");
+
+
+ }
+}
diff --git a/pom.xml b/pom.xml
index eb10361..49e5777 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,6 +26,10 @@
9.12.4544
1.18.38
+
+
+ 2.4.3
+ 5.12.2
@@ -36,6 +40,21 @@
ortools-java
${ortools-java.version}
+
+
+
+ net.datafaker
+ datafaker
+ ${datafaker.version}
+ test
+
+
+
+ org.junit.jupiter
+ junit-jupiter
+ ${junit-jupiter.version}
+ test
+