diff --git a/core/src/main/java/cz/muni/pa165/data/model/Car.java b/core/src/main/java/cz/muni/pa165/data/model/Car.java index cfd36d0e767f35be14f300ccdc7a8271e7e4168e..883d1caf6a5ebe96aa6c8f78f3d2b4b1b29bef0f 100644 --- a/core/src/main/java/cz/muni/pa165/data/model/Car.java +++ b/core/src/main/java/cz/muni/pa165/data/model/Car.java @@ -1,5 +1,6 @@ package cz.muni.pa165.data.model; +import com.fasterxml.jackson.annotation.JsonManagedReference; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; import jakarta.persistence.*; @@ -15,12 +16,14 @@ public class Car extends DomainObject implements Serializable { @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "driver_id") @Nullable + @JsonManagedReference private Driver driver; @OneToMany(fetch = FetchType.LAZY, mappedBy = "car", cascade = {CascadeType.REMOVE, CascadeType.PERSIST, CascadeType.MERGE}) @Nonnull + @JsonManagedReference private Set<CarComponent> components; public Car() { diff --git a/core/src/main/java/cz/muni/pa165/data/model/CarComponent.java b/core/src/main/java/cz/muni/pa165/data/model/CarComponent.java index f5641c0d22840e9cd6737e45d1d9e8ca716fa621..4dd89fd90717b45df9ae4f60f3006ba491cccf98 100644 --- a/core/src/main/java/cz/muni/pa165/data/model/CarComponent.java +++ b/core/src/main/java/cz/muni/pa165/data/model/CarComponent.java @@ -1,5 +1,6 @@ package cz.muni.pa165.data.model; +import com.fasterxml.jackson.annotation.JsonBackReference; import cz.muni.pa165.data.enums.ComponentTypeEnum; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @@ -29,6 +30,7 @@ public class CarComponent extends DomainObject implements Serializable { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "car_id") @Nullable + @JsonBackReference private Car car; public CarComponent() { diff --git a/core/src/main/java/cz/muni/pa165/data/model/Driver.java b/core/src/main/java/cz/muni/pa165/data/model/Driver.java index efa7bad06caf0c425cf334b18f929505357dd926..8650b6fadf0153173d23a646641035c660ad5c9f 100644 --- a/core/src/main/java/cz/muni/pa165/data/model/Driver.java +++ b/core/src/main/java/cz/muni/pa165/data/model/Driver.java @@ -1,5 +1,6 @@ package cz.muni.pa165.data.model; +import com.fasterxml.jackson.annotation.JsonBackReference; import cz.muni.pa165.data.enums.CharacteristicsEnum; import jakarta.annotation.Nonnull; import jakarta.annotation.Nullable; @@ -47,6 +48,7 @@ public class Driver extends DomainObject implements Serializable { mappedBy = "driver", cascade = {CascadeType.REMOVE, CascadeType.PERSIST, CascadeType.MERGE}) @Nullable + @JsonBackReference private Car car; public Driver() { diff --git a/core/src/main/java/cz/muni/pa165/service/CarService.java b/core/src/main/java/cz/muni/pa165/service/CarService.java index ea7292782c3410d98f3ed2c305281773d732c865..0ccc051378f01c6a73f1dea568369efaa54da638 100644 --- a/core/src/main/java/cz/muni/pa165/service/CarService.java +++ b/core/src/main/java/cz/muni/pa165/service/CarService.java @@ -8,30 +8,44 @@ import cz.muni.pa165.data.repository.CarRepository; import cz.muni.pa165.data.repository.DriverRepository; import cz.muni.pa165.exceptions.BadRequestException; import cz.muni.pa165.exceptions.ResourceNotFoundException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; @Service public class CarService extends DomainService<Car> { - + private static final Logger log = LoggerFactory.getLogger(CarService.class); private final DriverRepository driverRepository; private final CarRepository carRepository; private final CarComponentRepository carComponentRepository; + private final RestTemplate restTemplate; + + private static final String VISUALIZATION_MODULE_URL = "http://localhost:8082/visualization"; + @Autowired public CarService(CarRepository carRepository, DriverRepository driverRepository, - CarComponentRepository carComponentRepository) { + CarComponentRepository carComponentRepository, RestTemplate restTemplate) { super(carRepository, Car.class); this.driverRepository = driverRepository; this.carRepository = carRepository; this.carComponentRepository = carComponentRepository; + this.restTemplate = restTemplate; } public Car create(List<Long> componentIds) { @@ -95,7 +109,15 @@ public class CarService extends DomainService<Car> { carFromDb.get().setDriver(driverFromDb.get()); - return repository.save(carFromDb.get()); + var savedCar = repository.save(carFromDb.get()); + + try { + sendPostRequest(savedCar); + } catch (RestClientException | IllegalArgumentException e) { + log.debug(String.format("The visualization module is not reachable on the URL: %s, exception %s", VISUALIZATION_MODULE_URL, e)); + } + + return savedCar; } public Car removeDriver(Long carId) { @@ -153,4 +175,14 @@ public class CarService extends DomainService<Car> { repository.save(car); } } + + private void sendPostRequest(Car car) { + Map<String, Object> visualization = new HashMap<>(); + visualization.put("car", car); + + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity<Map<String, Object>> request = new HttpEntity<>(visualization, headers); + restTemplate.postForObject(VISUALIZATION_MODULE_URL, request, String.class); + } } diff --git a/core/src/main/java/cz/muni/pa165/service/DriverService.java b/core/src/main/java/cz/muni/pa165/service/DriverService.java index 33359e94acc730fa99aa5dc5c2fb7fb40fbc81ba..67740ec8e6c16f12dc84dc81b8fb76d3c70a6b99 100644 --- a/core/src/main/java/cz/muni/pa165/service/DriverService.java +++ b/core/src/main/java/cz/muni/pa165/service/DriverService.java @@ -4,20 +4,11 @@ import cz.muni.pa165.data.model.Driver; import cz.muni.pa165.data.repository.DriverRepository; import cz.muni.pa165.exceptions.BadRequestException; import cz.muni.pa165.exceptions.ResourceNotFoundException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.web.client.RestClientException; -import org.springframework.web.client.RestTemplate; -import java.util.HashMap; import java.util.List; -import java.util.Map; import java.util.Optional; /** @@ -26,19 +17,12 @@ import java.util.Optional; @Service public class DriverService extends DomainService<Driver> { - private static final Logger log = LoggerFactory.getLogger(DriverService.class); - private final DriverRepository driverRepository; - private final RestTemplate restTemplate; - - private static final String VISUALIZATION_MODULE_URL = "http://localhost:8082/visualization"; - @Autowired - public DriverService(DriverRepository repository, RestTemplate restTemplate) { + public DriverService(DriverRepository repository) { super(repository, Driver.class); driverRepository = repository; - this.restTemplate = restTemplate; } @Transactional(readOnly = true) @@ -48,12 +32,6 @@ public class DriverService extends DomainService<Driver> { throw new ResourceNotFoundException(entityClass, id); } - try { - sendPostRequest(dbDriver.get()); - } catch (RestClientException | IllegalArgumentException e) { - log.debug(String.format("The visualization module is not reachable on the URL: %s", VISUALIZATION_MODULE_URL)); - } - return dbDriver.get(); } @@ -91,17 +69,5 @@ public class DriverService extends DomainService<Driver> { repository.delete(driverFromDb.get()); } - - private void sendPostRequest(Driver driver) { - Map<String, Object> body = new HashMap<>(); - body.put("data", driver.toString()); - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - HttpEntity<Map<String, Object>> request = new HttpEntity<>(body, headers); - restTemplate.postForObject(VISUALIZATION_MODULE_URL, request, String.class); - - log.debug(String.format("Sent request %s to %s.", request, VISUALIZATION_MODULE_URL)); - } } diff --git a/core/src/test/java/cz/muni/pa165/service/CarServiceTest.java b/core/src/test/java/cz/muni/pa165/service/CarServiceTest.java index b4b00d4f14348d149acc69161a6cb66dc7e79a83..71dd68663fa4718674e1c4317c3610ee4eb1a7b9 100644 --- a/core/src/test/java/cz/muni/pa165/service/CarServiceTest.java +++ b/core/src/test/java/cz/muni/pa165/service/CarServiceTest.java @@ -17,6 +17,7 @@ import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.web.client.RestTemplate; import java.util.Arrays; import java.util.List; @@ -41,6 +42,9 @@ public class CarServiceTest { @Mock private CarComponentRepository carComponentRepository; + @Mock + private RestTemplate restTemplate; + @InjectMocks private CarService carService; private Car car; diff --git a/core/src/test/java/cz/muni/pa165/service/DriverServiceTest.java b/core/src/test/java/cz/muni/pa165/service/DriverServiceTest.java index 86bab1676609ad09f9f0a7e6fea7035972c1d8fa..5a068711033d61450240baec7c405344d101c623 100644 --- a/core/src/test/java/cz/muni/pa165/service/DriverServiceTest.java +++ b/core/src/test/java/cz/muni/pa165/service/DriverServiceTest.java @@ -23,13 +23,11 @@ import static org.mockito.Mockito.*; class DriverServiceTest { private DriverService driverService; private DriverRepository driverRepository; - private RestTemplate restTemplate; @BeforeEach void setUp() { driverRepository = mock(DriverRepository.class); - restTemplate = mock(RestTemplate.class); - driverService = new DriverService(driverRepository, restTemplate); + driverService = new DriverService(driverRepository); } @Test diff --git a/visualization/src/main/java/cz/muni/pa165/service/VisualizationService.java b/visualization/src/main/java/cz/muni/pa165/service/VisualizationService.java index 110af86ae1ff9c0d90b475750d1b20028ea2da04..2444161f7901ae1703d58e7e22587235874e7b47 100644 --- a/visualization/src/main/java/cz/muni/pa165/service/VisualizationService.java +++ b/visualization/src/main/java/cz/muni/pa165/service/VisualizationService.java @@ -11,6 +11,8 @@ import org.springframework.stereotype.Service; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; @Service public class VisualizationService { @@ -23,10 +25,8 @@ public class VisualizationService { // Create a content stream for the page PDPageContentStream contentStream = new PDPageContentStream(document, page); - // Set the font and font size for the content stream contentStream.setFont(PDType1Font.HELVETICA_BOLD, 16); - // Write some text to the content stream contentStream.beginText(); contentStream.newLineAtOffset(100, 700); contentStream.showText("Generated car PDF"); @@ -100,6 +100,9 @@ public class VisualizationService { ByteArrayOutputStream baos = new ByteArrayOutputStream(); document.save(baos); + // Save generated file + Files.write(Paths.get(String.format("C:\\WORKSPACE\\car-%s.pdf", carDto.getId())), baos.toByteArray()); + return new ByteArrayResource(baos.toByteArray()); } } diff --git a/visualization/src/test/java/cz/muni/pa165/rest/IntegrationTests.java b/visualization/src/test/java/cz/muni/pa165/rest/IntegrationTests.java index 57cd983d37cbd57c106c9b73a1e6af94ca735e82..97a22f2bb86a0e8cafd78e26ccb02b225d88fbb2 100644 --- a/visualization/src/test/java/cz/muni/pa165/rest/IntegrationTests.java +++ b/visualization/src/test/java/cz/muni/pa165/rest/IntegrationTests.java @@ -1,6 +1,10 @@ -/* package cz.muni.pa165.rest; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import cz.muni.pa165.generated.model.CarDto; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -10,43 +14,43 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; -import static org.junit.jupiter.api.Assertions.assertEquals; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -*/ /** * Integration tests. Run by "mvn verify / mvn test / mvn clean install". - * No need to test all the rest controllers logic here, just test that the endpoints are working - *//* + * No need to test all the rest controllers logic here, just test that the endpoints are working*/ + @SpringBootTest @AutoConfigureMockMvc class IntegrationTests { private static final Logger log = LoggerFactory.getLogger(IntegrationTests.class); + private final ObjectMapper mapper = new ObjectMapper().registerModule(new JavaTimeModule()); @Autowired private MockMvc mockMvc; @Test - void testVisualizationModuleResponse() throws Exception { - log.info("testVisualizationModuleResponse() running"); + void testGenerateCarPdf() throws Exception { + log.info("testCreateCar() running"); - String testRequestContent = "{\"data\":\"Hello\"}"; + var carDto = new CarDto().id(1L); + var requestBody = mapper.writeValueAsString(carDto); String response = mockMvc.perform( post("/visualization") - .accept(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_PDF) .contentType(MediaType.APPLICATION_JSON) - .content(testRequestContent)) + .content(requestBody)) .andExpect(status().isOk()) - .andReturn().getResponse().getContentAsString(); + .andReturn().getResponse().getContentType(); log.info("response: {}", response); - String expectedResponse = "{\"message\":\"--VISUALIZATION--Hello\"}"; - - assertEquals(expectedResponse, response); + Assertions.assertNotNull(response); + Assertions.assertEquals("application/pdf", response); } -}*/ + +} diff --git a/visualization/src/test/java/cz/muni/pa165/rest/VisualizationControllerTest.java b/visualization/src/test/java/cz/muni/pa165/rest/VisualizationControllerTest.java index 8fffd2e622aab16f470bb18681a67fd7c22db3cc..48900adcd521221852e772ec74cb8c82d22b91d5 100644 --- a/visualization/src/test/java/cz/muni/pa165/rest/VisualizationControllerTest.java +++ b/visualization/src/test/java/cz/muni/pa165/rest/VisualizationControllerTest.java @@ -1,16 +1,14 @@ /* package cz.muni.pa165.rest; -import cz.muni.pa165.generated.model.VisualizationSchemaCreateDto; -import cz.muni.pa165.generated.model.VisualizationSchemaDto; +import cz.muni.pa165.facade.VisualizationFacade; +import cz.muni.pa165.generated.model.CarDto; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNotNull; +import java.io.IOException; */ /** @@ -19,15 +17,19 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; class VisualizationControllerTest { private static final Logger log = LoggerFactory.getLogger(VisualizationControllerTest.class); - private final VisualizationController visualizationController = new VisualizationController(); + private final VisualizationFacade mockFacade = Mockito.mock(VisualizationFacade.class); + private final VisualizationController controller = new VisualizationController(mockFacade); + @Test - void testGetVisualization() { - log.debug("testGetVisualization() running"); + void testGenerateCarPdf() throws IOException { + log.debug("testGenerateCarPdf() running"); + + var car = new CarDto().id(1L); - ResponseEntity<VisualizationSchemaDto> responseEntity = visualizationController.getVisualization(new VisualizationSchemaCreateDto().data("test")); - assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); - assertNotNull(responseEntity.getBody()); - assertEquals("--VISUALIZATION--test", responseEntity.getBody().getMessage()); + controller.generateCarPdf(car); + + Mockito.verify(mockFacade, Mockito.times(1)).generateCarPdf(car); } -}*/ +} +*/