diff --git a/src/main/java/org/etsi/osl/tmf/so641/api/ServiceOrderApiController.java b/src/main/java/org/etsi/osl/tmf/so641/api/ServiceOrderApiController.java index 746597822ff7c915da2337bf58d52cd52a92e340..60b5182926540c7de0c3101d617ce2f6c23e3a33 100644 --- a/src/main/java/org/etsi/osl/tmf/so641/api/ServiceOrderApiController.java +++ b/src/main/java/org/etsi/osl/tmf/so641/api/ServiceOrderApiController.java @@ -143,6 +143,9 @@ public class ServiceOrderApiController implements ServiceOrderApi { return new ResponseEntity<ServiceOrder>(c, HttpStatus.OK); + } catch (NotFoundException e) { + log.error("Couldn't create Service Order. ", e); + return new ResponseEntity<ServiceOrder>(HttpStatus.BAD_REQUEST); } catch (Exception e) { log.error("Couldn't serialize response for content type application/json", e); return new ResponseEntity<ServiceOrder>(HttpStatus.INTERNAL_SERVER_ERROR); diff --git a/src/main/java/org/etsi/osl/tmf/so641/reposervices/ServiceOrderRepoService.java b/src/main/java/org/etsi/osl/tmf/so641/reposervices/ServiceOrderRepoService.java index d7214c4134e38adee1fbce93d8b92e3100e1f5d8..06864b4a940910bb7441faafc1281b96754588b8 100644 --- a/src/main/java/org/etsi/osl/tmf/so641/reposervices/ServiceOrderRepoService.java +++ b/src/main/java/org/etsi/osl/tmf/so641/reposervices/ServiceOrderRepoService.java @@ -25,14 +25,7 @@ import java.nio.charset.StandardCharsets; import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; import com.fasterxml.jackson.core.JsonProcessingException; @@ -45,30 +38,16 @@ import org.apache.commons.logging.LogFactory; import org.etsi.osl.tmf.common.model.Any; import org.etsi.osl.tmf.common.model.EValueType; import org.etsi.osl.tmf.common.model.UserPartRoleType; -import org.etsi.osl.tmf.common.model.service.Characteristic; -import org.etsi.osl.tmf.common.model.service.Note; -import org.etsi.osl.tmf.common.model.service.ResourceRef; -import org.etsi.osl.tmf.common.model.service.ServiceRef; +import org.etsi.osl.tmf.common.model.service.*; import org.etsi.osl.tmf.prm669.model.RelatedParty; import org.etsi.osl.tmf.scm633.model.ServiceSpecCharacteristic; import org.etsi.osl.tmf.scm633.model.ServiceSpecCharacteristicValue; import org.etsi.osl.tmf.scm633.model.ServiceSpecification; import org.etsi.osl.tmf.scm633.reposervices.ServiceSpecificationRepoService; import org.etsi.osl.tmf.sim638.service.ServiceRepoService; +import org.etsi.osl.tmf.so641.api.NotFoundException; import org.etsi.osl.tmf.so641.api.ServiceOrderApiRouteBuilderEvents; -import org.etsi.osl.tmf.so641.model.ServiceOrder; -import org.etsi.osl.tmf.so641.model.ServiceOrderActionType; -import org.etsi.osl.tmf.so641.model.ServiceOrderAttributeValueChangeEvent; -import org.etsi.osl.tmf.so641.model.ServiceOrderAttributeValueChangeNotification; -import org.etsi.osl.tmf.so641.model.ServiceOrderCreate; -import org.etsi.osl.tmf.so641.model.ServiceOrderCreateEvent; -import org.etsi.osl.tmf.so641.model.ServiceOrderCreateNotification; -import org.etsi.osl.tmf.so641.model.ServiceOrderItem; -import org.etsi.osl.tmf.so641.model.ServiceOrderRelationship; -import org.etsi.osl.tmf.so641.model.ServiceOrderStateChangeEvent; -import org.etsi.osl.tmf.so641.model.ServiceOrderStateChangeNotification; -import org.etsi.osl.tmf.so641.model.ServiceOrderStateType; -import org.etsi.osl.tmf.so641.model.ServiceOrderUpdate; +import org.etsi.osl.tmf.so641.model.*; import org.etsi.osl.tmf.so641.repo.ServiceOrderRepository; import org.etsi.osl.tmf.util.KrokiClient; import org.hibernate.Hibernate; @@ -319,7 +298,20 @@ public class ServiceOrderRepoService { } @Transactional - public ServiceOrder addServiceOrder(@Valid ServiceOrderCreate serviceOrderCreate) { + public ServiceOrder addServiceOrder(@Valid ServiceOrderCreate serviceOrderCreate) throws NotFoundException { + // Ensure that all Services Specifications exist + List <ServiceOrderItem> serviceOrderItemList = serviceOrderCreate.getOrderItem(); + for (ServiceOrderItem serviceOrderItem: serviceOrderItemList) { + ServiceRestriction serviceRestriction = serviceOrderItem.getService(); + ServiceSpecificationRef serviceSpecificationRef = serviceRestriction.getServiceSpecification(); + String serviceSpecificationId = serviceSpecificationRef.getId(); + + ServiceSpecification serviceSpecification = serviceSpecRepoService.findByUuid(serviceSpecificationId); + + if (serviceSpecification == null) + throw new NotFoundException(400, "There is no Service Specification with Id: " + serviceSpecificationId); + } + ServiceOrder so = new ServiceOrder(); so.setOrderDate(OffsetDateTime.now(ZoneOffset.UTC)); so.setCategory(serviceOrderCreate.getCategory()); @@ -539,6 +531,7 @@ public class ServiceOrderRepoService { ServiceOrder so = this.findByUuid(id); boolean stateChanged = false; + boolean expectedCompletionDateChanged = false; //logger.info("so:" + so.toString()); for (ServiceOrderItem oi : so.getOrderItem() ) { @@ -590,7 +583,7 @@ public class ServiceOrderRepoService { if ( serviceOrderUpd.getExpectedCompletionDate()!= null ) { so.setExpectedCompletionDate(serviceOrderUpd.getExpectedCompletionDate()); - + expectedCompletionDateChanged = true; } if ( serviceOrderUpd.getStartDate()!= null ) { @@ -655,8 +648,17 @@ public class ServiceOrderRepoService { so.addNoteItem(noteItem); } - - + // Update each Service's end date to the updated Service Order's expected completion date + if (expectedCompletionDateChanged) { + List<String> services = serviceRepoService.getServicesFromOrderID(id); + + for (String serviceId : services) { + logger.debug("Will delegate updated SO expected completion date " + so.getExpectedCompletionDate() + " to service with id = " + serviceId); + + org.etsi.osl.tmf.sim638.model.Service service = serviceRepoService.findByUuid(serviceId); + service.setEndDate(so.getExpectedCompletionDate()); + } + } @@ -827,12 +829,15 @@ public class ServiceOrderRepoService { } public String addServiceOrderReturnEager(@Valid ServiceOrderCreate serviceOrderCreate) { - ServiceOrder so = this.addServiceOrder(serviceOrderCreate); try { + ServiceOrder so = this.addServiceOrder(serviceOrderCreate); return this.getServiceOrderEagerAsString( so.getUuid()); } catch (JsonProcessingException e) { // TODO Auto-generated catch block e.printStackTrace(); + } catch (NotFoundException e) { + // TODO Auto-generated catch block + e.printStackTrace(); } return null; } diff --git a/src/test/java/org/etsi/osl/services/api/ServiceOrderIntegrationTest.java b/src/test/java/org/etsi/osl/services/api/ServiceOrderIntegrationTest.java index 3368f21209ed646541655f035e8bce49139067ce..017804bfc044adbd710d2f7999d0fc1dc7696406 100644 --- a/src/test/java/org/etsi/osl/services/api/ServiceOrderIntegrationTest.java +++ b/src/test/java/org/etsi/osl/services/api/ServiceOrderIntegrationTest.java @@ -33,6 +33,7 @@ import java.net.URI; import java.time.OffsetDateTime; import java.time.ZoneOffset; import java.util.ArrayList; +import java.util.List; import org.apache.camel.CamelContext; import org.apache.camel.RoutesBuilder; @@ -355,9 +356,19 @@ public class ServiceOrderIntegrationTest { ServiceOrder sspeccr1SO = JsonUtils.toJsonObj(sspectextSO, ServiceOrder.class); assertThat(sspeccr1SO).isNotNull(); - - - + + // Ensure that all Services' end dates were updated correctly + boolean allSupportingServicesEndDatesUpdatedToServiceOrderExpectedCompletionDate = true; + List<String> services = serviceRepoService.getServicesFromOrderID(responseSO.getId()); + + for (String serviceId : services) { + Service service = serviceRepoService.findByUuid(serviceId); + if (!service.getEndDate().equals(responseSOUpd.getExpectedCompletionDate())) { + allSupportingServicesEndDatesUpdatedToServiceOrderExpectedCompletionDate = false; + break; + } + } + assertThat(allSupportingServicesEndDatesUpdatedToServiceOrderExpectedCompletionDate).isTrue(); } @WithMockUser(username="osadmin", roles = {"USER"}) diff --git a/src/test/java/org/etsi/osl/services/api/so641/ServiceOrderApiControllerTest.java b/src/test/java/org/etsi/osl/services/api/so641/ServiceOrderApiControllerTest.java index 3af3d05b4e6b3c43bd2581ad06ea9c66931a3f67..305d454c0c3391b3f454e05b56e7a0d72d6e45b0 100644 --- a/src/test/java/org/etsi/osl/services/api/so641/ServiceOrderApiControllerTest.java +++ b/src/test/java/org/etsi/osl/services/api/so641/ServiceOrderApiControllerTest.java @@ -89,6 +89,15 @@ public class ServiceOrderApiControllerTest { } + @WithMockUser(username="osadmin", roles = {"ADMIN","USER"}) + @Test + public void testCreateServiceOrderWithNonExistingServiceSpecification() throws Exception { + + createServiceOrderWithNonExistingServiceSpecification(); + assertThat( serviceOrderRepoService.findAll().size() ).isEqualTo( FIXED_BOOTSTRAPS_SPECS ); + } + + @WithMockUser(username="osadmin", roles = {"ADMIN","USER"}) @Test public void testDeleteServiceOrder() throws Exception { @@ -278,4 +287,35 @@ public class ServiceOrderApiControllerTest { return responsesSpec; } -} + + + private void createServiceOrderWithNonExistingServiceSpecification() throws Exception { + + assertThat( serviceOrderRepoService.findAll().size() ).isEqualTo( FIXED_BOOTSTRAPS_SPECS); + + ServiceOrderCreate serviceOrder = new ServiceOrderCreate(); + serviceOrder.setCategory("Test Category"); + serviceOrder.setDescription("A Test Service Order"); + serviceOrder.setRequestedStartDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); + serviceOrder.setRequestedCompletionDate(OffsetDateTime.now(ZoneOffset.UTC).toString()); + + ServiceOrderItem soi = new ServiceOrderItem(); + serviceOrder.getOrderItem().add(soi); + soi.setState(ServiceOrderStateType.ACKNOWLEDGED); + + ServiceRestriction serviceRestriction = new ServiceRestriction(); + ServiceSpecificationRef aServiceSpecificationRef = new ServiceSpecificationRef(); + aServiceSpecificationRef.setId("A random non-existing Id"); + aServiceSpecificationRef.setName("A random non-existing name"); + + serviceRestriction.setServiceSpecification(aServiceSpecificationRef); + serviceRestriction.setName("aServiceRestriction"); + soi.setService(serviceRestriction); + + mvc + .perform(MockMvcRequestBuilders.post("/serviceOrdering/v4/serviceOrder") + .with( SecurityMockMvcRequestPostProcessors.csrf()) + .contentType(MediaType.APPLICATION_JSON).content(JsonUtils.toJson(serviceOrder))) + .andExpect(status().isBadRequest()).andReturn().getResponse().getContentAsString(); + } +} \ No newline at end of file