package com.eactive.testmaster.api.service; import com.eactive.testmaster.api.entity.MockCondition; import com.eactive.testmaster.api.entity.MockResponse; import com.eactive.testmaster.api.entity.MockRoute; import com.eactive.testmaster.api.repository.MockRouteRepository; import com.eactive.testmaster.common.exception.NotFoundException; import org.apache.commons.beanutils.BeanUtils; import org.hibernate.Hibernate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import javax.transaction.Transactional; import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; @Service @Transactional public class MockRouteService { private static final String NOT_FOUND_MESSAGE = "Route Not Found"; @Autowired MockRouteRepository mockRouteRepository; private List allRoutes = new ArrayList<>(); public List getAllRoutes() { return allRoutes; } public void setAllRoutes(List allRoutes) { this.allRoutes = allRoutes; } public Page findAll(Specification mockRouteSpecification, Pageable pageable) { return mockRouteRepository.findAll(mockRouteSpecification, pageable); } public MockRoute findById(Long id) { return mockRouteRepository.findById(id).orElseThrow(() -> new NotFoundException(NOT_FOUND_MESSAGE)); } public void create(MockRoute mockRoute) { if (!mockRoute.getPathPattern().startsWith("/")) { mockRoute.setPathPattern("/" + mockRoute.getPathPattern()); } for (MockResponse response : mockRoute.getResponses()) { response.setRoute(mockRoute); if (response.getConditions() != null) { for (MockCondition condition : response.getConditions()) { condition.setMockResponse(response); } } } mockRouteRepository.save(mockRoute); } public void deleteById(long id) { mockRouteRepository.deleteById(id); } public void update(Long id, MockRoute updated) { MockRoute route = mockRouteRepository.findById(id).orElseThrow(() -> new NotFoundException(NOT_FOUND_MESSAGE)); route.getResponses().clear(); route.setName(updated.getName()); route.setDescription(updated.getDescription()); // route.setMethod(updated.getMethod()); // route.setPathPattern(updated.getPathPattern()); if (!route.getPathPattern().startsWith("/")) { route.setPathPattern("/" + route.getPathPattern()); } route.getResponses().addAll(updated.getResponses()); for (MockResponse response : route.getResponses()) { response.setRoute(route); if (response.getConditions() != null) { for (MockCondition condition : response.getConditions()) { condition.setMockResponse(response); } } } mockRouteRepository.save(route); } public void initAllRoutes() { allRoutes.clear(); List routes = mockRouteRepository.findAll(); for (MockRoute route : routes) { for (MockResponse response : route.getResponses()) { if (response.getConditions() != null) { for (MockCondition condition : response.getConditions()) { Hibernate.initialize(condition.getMockResponse()); } } if (response.getHeaders() != null) { Hibernate.initialize(response.getHeaders()); } Hibernate.initialize(response); } try { MockRoute cloned = (MockRoute) BeanUtils.cloneBean(route); allRoutes.add(cloned); } catch (IllegalAccessException | InstantiationException | InvocationTargetException | NoSuchMethodException e) { throw new RuntimeException(e); } } } }