From 9220f7f3b82834e68fb1af23f0266e23d3a50952 Mon Sep 17 00:00:00 2001
From: Hendrik Jungnitsch <hendrik.jungnitsch@gedoplan.de>
Date: Di, 06 Sep 2022 15:00:35 +0200
Subject: [PATCH] exercise

---
 src/main/java/de/gedoplan/seminar/jpa/exercise/repository/MaintenanceDepartmentRepository.java |    9 ++
 src/main/java/de/gedoplan/seminar/jpa/exercise/domain/MaintenanceDepartment.java               |   27 ++++++
 src/test/java/de/gedoplan/seminar/jpa/exercise/Exercise05Test.java                             |   72 ++++++++++++++++++
 src/main/java/de/gedoplan/seminar/jpa/exercise/common/GeneratedIntegerIdEntity.java            |   39 +++++++++
 src/main/java/de/gedoplan/seminar/jpa/exercise/rest/MaintenanceDepartmentResource.java         |   61 +++++++++++++++
 5 files changed, 208 insertions(+), 0 deletions(-)

diff --git a/src/main/java/de/gedoplan/seminar/jpa/exercise/common/GeneratedIntegerIdEntity.java b/src/main/java/de/gedoplan/seminar/jpa/exercise/common/GeneratedIntegerIdEntity.java
new file mode 100644
index 0000000..27da6bd
--- /dev/null
+++ b/src/main/java/de/gedoplan/seminar/jpa/exercise/common/GeneratedIntegerIdEntity.java
@@ -0,0 +1,39 @@
+package de.gedoplan.seminar.jpa.exercise.common;
+
+import java.util.Objects;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+
+@MappedSuperclass
+public abstract class GeneratedIntegerIdEntity {
+	
+	@Id
+	@GeneratedValue(strategy = GenerationType.IDENTITY)
+	private Integer id;
+
+	public Integer getId() {
+		return id;
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(id);
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		GeneratedIntegerIdEntity other = (GeneratedIntegerIdEntity) obj;
+		return Objects.equals(id, other.id);
+	}
+	
+	
+}
diff --git a/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/MaintenanceDepartment.java b/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/MaintenanceDepartment.java
new file mode 100644
index 0000000..ee57a0f
--- /dev/null
+++ b/src/main/java/de/gedoplan/seminar/jpa/exercise/domain/MaintenanceDepartment.java
@@ -0,0 +1,27 @@
+package de.gedoplan.seminar.jpa.exercise.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+import de.gedoplan.seminar.jpa.exercise.common.GeneratedIntegerIdEntity;
+
+@Entity
+@Table(name = MaintenanceDepartment.TABLE_NAME)
+public class MaintenanceDepartment extends GeneratedIntegerIdEntity {
+  public static final String TABLE_NAME = "JPA_MAINTENANCE_DEPT";
+  public static final String TABLE_NAME_HIGHWAYS = "JPA_MAINTENANCE_DEPT_HIGHWAY";
+
+  private String name;
+
+
+  protected MaintenanceDepartment() {
+  }
+
+  public MaintenanceDepartment(String name, Highway... highways) {
+    this.name = name;
+  }
+
+  public String getName() {
+    return this.name;
+  }
+}
diff --git a/src/main/java/de/gedoplan/seminar/jpa/exercise/repository/MaintenanceDepartmentRepository.java b/src/main/java/de/gedoplan/seminar/jpa/exercise/repository/MaintenanceDepartmentRepository.java
new file mode 100644
index 0000000..4e48e81
--- /dev/null
+++ b/src/main/java/de/gedoplan/seminar/jpa/exercise/repository/MaintenanceDepartmentRepository.java
@@ -0,0 +1,9 @@
+package de.gedoplan.seminar.jpa.exercise.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+import de.gedoplan.seminar.jpa.exercise.domain.MaintenanceDepartment;
+
+public interface MaintenanceDepartmentRepository extends JpaRepository<MaintenanceDepartment, Integer> {
+
+}
diff --git a/src/main/java/de/gedoplan/seminar/jpa/exercise/rest/MaintenanceDepartmentResource.java b/src/main/java/de/gedoplan/seminar/jpa/exercise/rest/MaintenanceDepartmentResource.java
new file mode 100644
index 0000000..c89a543
--- /dev/null
+++ b/src/main/java/de/gedoplan/seminar/jpa/exercise/rest/MaintenanceDepartmentResource.java
@@ -0,0 +1,61 @@
+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.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import de.gedoplan.seminar.jpa.exercise.domain.MaintenanceDepartment;
+import de.gedoplan.seminar.jpa.exercise.repository.MaintenanceDepartmentRepository;
+
+@RequestMapping(path = "/mdeps", produces = MediaType.APPLICATION_JSON_VALUE)
+@RestController
+public class MaintenanceDepartmentResource {
+
+	@Autowired
+	Logger logger;
+
+	@Autowired
+	MaintenanceDepartmentRepository maintenanceDepartmentRepository;
+
+	@PostMapping(consumes = MediaType.APPLICATION_JSON_VALUE)
+	public void insert(@RequestBody MaintenanceDepartment maintenanceDepartment) {
+		this.logger.debug("----- insert -----");
+
+		this.maintenanceDepartmentRepository.save(maintenanceDepartment);
+
+		this.logger.debug("Inserted: " + maintenanceDepartment);
+	}
+
+	/**
+	 * Exercise JPA_BASICS_05: Find all entries.
+	 */
+	@GetMapping
+	public List<MaintenanceDepartment> findAll() {
+		this.logger.debug("----- findAll -----");
+
+		List<MaintenanceDepartment> maintenanceDepartments = maintenanceDepartmentRepository.findAll();
+		this.logger.debug("Gefunden: " + maintenanceDepartments);
+		return maintenanceDepartments;
+	}
+
+	/**
+	 * Exercise JPA_BASICS_06: Find by highway name.
+	 */
+	@GetMapping("findByHighwayName")
+	public List<MaintenanceDepartment> findByHighwayName(@RequestParam("name") String highwayName) {
+		this.logger.debug("----- findByHighwayName -----");
+
+		List<MaintenanceDepartment> maintenanceDepartments = List.of(); // this.highwayRepository.
+		this.logger.debug(highwayName + ": " + maintenanceDepartments);
+		return maintenanceDepartments;
+	}
+
+}
diff --git a/src/test/java/de/gedoplan/seminar/jpa/exercise/Exercise05Test.java b/src/test/java/de/gedoplan/seminar/jpa/exercise/Exercise05Test.java
new file mode 100644
index 0000000..dd84076
--- /dev/null
+++ b/src/test/java/de/gedoplan/seminar/jpa/exercise/Exercise05Test.java
@@ -0,0 +1,72 @@
+package de.gedoplan.seminar.jpa.exercise;
+
+import static org.hamcrest.CoreMatchers.is;
+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.jsonPath;
+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.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 de.gedoplan.seminar.jpa.exercise.domain.Highway;
+import de.gedoplan.seminar.jpa.exercise.domain.MaintenanceDepartment;
+
+@TestMethodOrder(MethodOrderer.MethodName.class)
+@AutoConfigureMockMvc
+@SpringBootTest
+public class Exercise05Test {
+
+	@Autowired
+	MockMvc mockMvc;
+
+	@Autowired
+	ObjectMapper objectMapper;
+
+	@ParameterizedTest
+	@MethodSource("getTestData")
+	public void test01_insert(String maintenanceDepartmentName, List<Integer> highwayIds) throws JsonProcessingException, Exception {
+		Highway[] highways = highwayIds.stream().map(this::loadHighway).toArray(Highway[]::new);
+		MaintenanceDepartment maintenanceDepartment = new MaintenanceDepartment(maintenanceDepartmentName, highways);
+		mockMvc.perform(post("/mdeps")
+				.contentType(MediaType.APPLICATION_JSON)
+				.content(objectMapper.writeValueAsString(maintenanceDepartment)))
+			.andExpect(status().isOk());
+	}
+	
+	@Test
+	void test02_checkFindAll(Integer highwayId, Integer countJunctions) throws Exception {
+		mockMvc.perform(get("/mdeps",highwayId))
+			.andExpect(jsonPath("$[?(@.name=='Kamen')].highways.size()",is(2)))
+			.andExpect(jsonPath("$[?(@.name=='Bielefeld')].highways.size()",is(2)));
+	}
+
+	private Highway loadHighway(Integer id) {
+		try {
+			return objectMapper.readValue(mockMvc.perform(get("/highways/{id}", id)).andExpect(status().isOk())
+					.andReturn().getResponse().getContentAsString(), Highway.class);
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+	}
+
+	private static Stream<Arguments> getTestData() {
+		return Stream.of(arguments("Kamen", List.of(4610, 4711)), arguments("Bielefeld", List.of(4711, 4812)));
+	}
+}

--
Gitblit v1.7.1