From 18134907066301a801f4747926592c5977141279 Mon Sep 17 00:00:00 2001
From: Hendrik Jungnitsch <hendrik.jungnitsch@gedoplan.de>
Date: Mo, 14 Nov 2022 12:24:21 +0100
Subject: [PATCH] exercise07

---
 src/main/java/de/gedoplan/seminar/jpa/exercise/repository/TrafficJamRepository.java |   11 ++
 src/main/java/de/gedoplan/seminar/jpa/exercise/domain/Junction.java                 |    1 
 src/main/java/de/gedoplan/seminar/jpa/exercise/domain/TrafficJam.java               |   61 +++++++++++++++
 src/main/java/de/gedoplan/seminar/jpa/exercise/domain/Highway.java                  |    1 
 src/main/java/de/gedoplan/seminar/jpa/exercise/domain/TrafficJamKind.java           |    5 +
 src/main/java/de/gedoplan/seminar/jpa/exercise/domain/TrafficJamCause.java          |    6 +
 src/test/java/de/gedoplan/seminar/jpa/exercise/Exercise07Test.java                  |   51 ++++++++++++
 src/main/java/de/gedoplan/seminar/jpa/exercise/rest/TrafficJamResource.java         |   45 +++++++++++
 8 files changed, 176 insertions(+), 5 deletions(-)

diff --git a/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/Highway.java b/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/Highway.java
index dcc0964..ca4db07 100644
--- a/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/Highway.java
+++ b/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/Highway.java
@@ -10,7 +10,6 @@
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 
-
 @Entity
 @Table(name = Highway.TABLE_NAME)
 public class Highway {
diff --git a/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/Junction.java b/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/Junction.java
index 3cb3293..5a6dbf3 100644
--- a/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/Junction.java
+++ b/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/Junction.java
@@ -13,7 +13,6 @@
 
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
 
-
 @Entity
 @Table(name = Junction.TABLE_NAME)
 public class Junction {
diff --git a/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/TrafficJam.java b/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/TrafficJam.java
new file mode 100644
index 0000000..9425cd3
--- /dev/null
+++ b/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/TrafficJam.java
@@ -0,0 +1,61 @@
+package de.gedoplan.seminar.jpa.exercise.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+import de.gedoplan.seminar.jpa.exercise.common.GeneratedIntegerIdEntity;
+
+@Entity
+@Table(name = TrafficJam.TABLE_NAME)
+public class TrafficJam extends GeneratedIntegerIdEntity {
+	public static final String TABLE_NAME = "JPA_TRAFFIC_JAM";
+
+	@ManyToOne
+	private Junction start;
+
+	@ManyToOne
+	private Junction end;
+
+	private int length;
+
+	@Enumerated(EnumType.STRING)
+	private TrafficJamKind kind;
+
+	@Enumerated(EnumType.STRING)
+	private TrafficJamCause cause;
+
+	protected TrafficJam() {
+	}
+
+	public TrafficJam(Junction start, Junction end, int length, TrafficJamKind kind, TrafficJamCause cause) {
+		this.start = start;
+		this.end = end;
+		this.length = length;
+		this.cause = cause;
+		this.kind = kind;
+	}
+
+	public Junction getStart() {
+		return this.start;
+	}
+
+	public Junction getEnd() {
+		return this.end;
+	}
+
+	public int getLength() {
+		return this.length;
+	}
+
+	public TrafficJamKind getKind() {
+		return this.kind;
+	}
+
+	public TrafficJamCause getCause() {
+		return this.cause;
+	}
+
+}
diff --git a/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/TrafficJamCause.java b/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/TrafficJamCause.java
new file mode 100644
index 0000000..5aad373
--- /dev/null
+++ b/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/TrafficJamCause.java
@@ -0,0 +1,6 @@
+package de.gedoplan.seminar.jpa.exercise.domain;
+
+public enum TrafficJamCause {
+  ROAD_WORKS, ACCIDENT, TRAFFIC_VOLUME
+}
+
diff --git a/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/TrafficJamKind.java b/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/TrafficJamKind.java
new file mode 100644
index 0000000..4103beb
--- /dev/null
+++ b/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/TrafficJamKind.java
@@ -0,0 +1,5 @@
+package de.gedoplan.seminar.jpa.exercise.domain;
+
+public enum TrafficJamKind {
+  CONGESTION, SLOW_MOVING_TRAFFIC
+}
diff --git a/src/main/java/de/gedoplan/seminar/jpa/exercise/repository/TrafficJamRepository.java b/src/main/java/de/gedoplan/seminar/jpa/exercise/repository/TrafficJamRepository.java
new file mode 100644
index 0000000..5b38a6c
--- /dev/null
+++ b/src/main/java/de/gedoplan/seminar/jpa/exercise/repository/TrafficJamRepository.java
@@ -0,0 +1,11 @@
+package de.gedoplan.seminar.jpa.exercise.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import de.gedoplan.seminar.jpa.exercise.domain.TrafficJam;
+
+@Repository
+public interface TrafficJamRepository extends JpaRepository<TrafficJam, Integer> {
+
+}
diff --git a/src/main/java/de/gedoplan/seminar/jpa/exercise/rest/TrafficJamResource.java b/src/main/java/de/gedoplan/seminar/jpa/exercise/rest/TrafficJamResource.java
new file mode 100644
index 0000000..5868324
--- /dev/null
+++ b/src/main/java/de/gedoplan/seminar/jpa/exercise/rest/TrafficJamResource.java
@@ -0,0 +1,45 @@
+package de.gedoplan.seminar.jpa.exercise.rest;
+
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import de.gedoplan.seminar.jpa.exercise.domain.TrafficJam;
+import de.gedoplan.seminar.jpa.exercise.repository.TrafficJamRepository;
+
+@RequestMapping(path = "/trafficjams", produces = MediaType.APPLICATION_JSON_VALUE)
+@RestController
+public class TrafficJamResource {
+
+	@Autowired
+	Logger logger;
+
+	@Autowired
+	TrafficJamRepository trafficJamRepository;
+
+	@PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
+	public void insert(@RequestBody TrafficJam trafficJam) {
+		this.logger.debug("----- insert -----");
+
+		this.trafficJamRepository.save(trafficJam);
+
+		this.logger.debug("Inserted: " + trafficJam);
+	}
+
+	@GetMapping
+	public List<TrafficJam> findAll() {
+		this.logger.debug("----- findAll -----");
+
+		List<TrafficJam> trafficJams = trafficJamRepository.findAll();
+		this.logger.debug("Gefunden: " + trafficJams);
+		return trafficJams;
+	}
+
+}
diff --git a/src/test/java/de/gedoplan/seminar/jpa/exercise/Exercise07Test.java b/src/test/java/de/gedoplan/seminar/jpa/exercise/Exercise07Test.java
index fce1c4d..fe124f9 100644
--- a/src/test/java/de/gedoplan/seminar/jpa/exercise/Exercise07Test.java
+++ b/src/test/java/de/gedoplan/seminar/jpa/exercise/Exercise07Test.java
@@ -1,23 +1,35 @@
 package de.gedoplan.seminar.jpa.exercise;
 
+import static org.junit.jupiter.params.provider.Arguments.arguments;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 
 import java.util.List;
+import java.util.stream.Stream;
 
 import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Test;
 import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
 import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
 import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.http.MediaType;
 import org.springframework.test.web.servlet.MockMvc;
 
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.type.CollectionType;
 
+import de.gedoplan.seminar.jpa.exercise.domain.Highway;
 import de.gedoplan.seminar.jpa.exercise.domain.Junction;
+import de.gedoplan.seminar.jpa.exercise.domain.TrafficJam;
+import de.gedoplan.seminar.jpa.exercise.domain.TrafficJamCause;
+import de.gedoplan.seminar.jpa.exercise.domain.TrafficJamKind;
 
 @TestMethodOrder(MethodOrderer.MethodName.class)
 @AutoConfigureMockMvc
@@ -35,10 +47,43 @@
 	@Autowired
 	private Logger logger;
 
+	@ParameterizedTest
+	@MethodSource("getTestData")
+	void test01_insert(String junctionStart, String junctionEnd, Integer length, TrafficJamKind kind,
+			TrafficJamCause cause) throws Exception {
+
+		TrafficJam trafficJam = new TrafficJam(loadJunctionId(junctionStart), loadJunctionId(junctionEnd), length, kind,
+				cause);
+		mockMvc.perform(post("/trafficjams").contentType(MediaType.APPLICATION_JSON)
+				.content(mapper.writeValueAsString(trafficJam))).andExpect(status().isOk());
+	}
+
+	@Test
+	void test02_outputTrafficJams() throws Exception {
+		parse(mockMvc.perform(get("/trafficjams")).andExpect(status().isOk()).andReturn().getResponse()
+				.getContentAsString(), TrafficJam.class)
+		.stream().map(this::toMessage).forEach(logger::info);
+
+	}
 	
-	// Test01 insert
-	
-	// Test02 output
+	private String toMessage(TrafficJam trafficJam) {
+		Junction start = trafficJam.getStart();
+	    Highway highway = start.getHighway();
+	    Junction end = trafficJam.getEnd();
+	    return String.format(MESSAGE_FORMAT,
+	      highway.getName(), highway.getOrigin(), highway.getDestination(),
+	      trafficJam.getLength(), trafficJam.getKind(),
+	      start.getName(), end.getName(),
+	      trafficJam.getCause());
+	}
+
+	private static Stream<Arguments> getTestData() {
+		return Stream.of(
+				arguments("Bielefeld-Ost", "Ostwestfalen/Lippe", 2, TrafficJamKind.CONGESTION,
+						TrafficJamCause.ACCIDENT),
+				arguments("Westhofener Kreuz", "Schwerte", 8, TrafficJamKind.SLOW_MOVING_TRAFFIC,
+						TrafficJamCause.ROAD_WORKS));
+	}
 
 
 	private Junction loadJunctionId(String name) throws Exception {

--
Gitblit v1.7.1