Loading src/main/java/org/etsi/osl/tmf/sim638/api/ServiceApiController.java +13 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,8 @@ import org.etsi.osl.tmf.sim638.model.ServiceCreate; import org.etsi.osl.tmf.sim638.model.ServiceUpdate; import org.etsi.osl.tmf.sim638.service.ServiceRepoService; import org.etsi.osl.tmf.util.AddUserAsOwnerToRelatedParties; import org.etsi.osl.tmf.util.ServiceInventoryValidator; import org.etsi.osl.tmf.util.ServiceSpecificationValidator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; Loading @@ -40,6 +42,8 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.RequestMapping; import org.etsi.osl.model.nfv.UserRoleType; Loading @@ -61,6 +65,15 @@ public class ServiceApiController implements ServiceApi { @Autowired ServiceRepoService serviceRepoService; @Autowired private ServiceInventoryValidator serviceInventoryValidator; // Custom validation resulting from ServiceSpecCharacteristicValue range interval and type validation (https://labs.etsi.org/rep/groups/osl/code/-/epics/30) @InitBinder protected void initBinder(WebDataBinder binder) { binder.addValidators(serviceInventoryValidator); } @org.springframework.beans.factory.annotation.Autowired public ServiceApiController(ObjectMapper objectMapper, HttpServletRequest request) { this.objectMapper = objectMapper; Loading src/main/java/org/etsi/osl/tmf/util/CharacteristicParser.java 0 → 100644 +48 −0 Original line number Diff line number Diff line package org.etsi.osl.tmf.util; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.etsi.osl.tmf.common.model.Any; import org.etsi.osl.tmf.common.model.service.Characteristic; import org.etsi.osl.tmf.scm633.model.ServiceSpecCharacteristicValue; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; public class CharacteristicParser { private static final ObjectMapper mapper = new ObjectMapper(); public Set<ServiceSpecCharacteristicValue> toSetOfCharacteristicValues(Characteristic characteristic) { Set<ServiceSpecCharacteristicValue> result = new HashSet<>(); Any input = characteristic.getValue(); if (input == null) { return result; } try { JsonNode node = mapper.readTree(input.getValue()); if (node.isArray()) { Set<Any> values = mapper.readValue(input.getValue(), new TypeReference<Set<Any>>() {}); result = values.stream().map(value -> { ServiceSpecCharacteristicValue serviceSpecCharacteristicValue = new ServiceSpecCharacteristicValue(); serviceSpecCharacteristicValue.setValue(value); return serviceSpecCharacteristicValue; }).collect(Collectors.toSet()); } else if (node.isObject()) { ServiceSpecCharacteristicValue serviceSpecCharacteristicValue = new ServiceSpecCharacteristicValue(); serviceSpecCharacteristicValue.setValue(mapper.treeToValue(node, Any.class)); result.add(serviceSpecCharacteristicValue); } else { ServiceSpecCharacteristicValue serviceSpecCharacteristicValue = new ServiceSpecCharacteristicValue(); serviceSpecCharacteristicValue.setValue(input); result.add(serviceSpecCharacteristicValue); } } catch (Exception e) { ServiceSpecCharacteristicValue serviceSpecCharacteristicValue = new ServiceSpecCharacteristicValue(); serviceSpecCharacteristicValue.setValue(input); result.add(serviceSpecCharacteristicValue); } return result; } } src/main/java/org/etsi/osl/tmf/util/ServiceInventoryValidator.java 0 → 100644 +46 −0 Original line number Diff line number Diff line package org.etsi.osl.tmf.util; import org.etsi.osl.tmf.common.model.service.Characteristic; import org.etsi.osl.tmf.scm633.model.ServiceSpecCharacteristic; import org.etsi.osl.tmf.scm633.model.ServiceSpecification; import org.etsi.osl.tmf.scm633.reposervices.ServiceSpecificationRepoService; import org.etsi.osl.tmf.sim638.model.ServiceUpdate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.validation.Errors; import org.springframework.validation.Validator; @Component public class ServiceInventoryValidator implements Validator { @Autowired private ServiceSpecificationRepoService serviceSpecificationRepoService; @Override public boolean supports(Class<?> clazz) { return ServiceUpdate.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { ServiceUpdate update = (ServiceUpdate) target; if (update.getServiceCharacteristic() == null || update.getServiceSpecificationRef() == null) { return; } String serviceSpecificationId = update.getServiceSpecificationRef().getId(); ServiceSpecification serviceSpecification = serviceSpecificationRepoService.findByUuid(serviceSpecificationId); CharacteristicParser characteristicParser = new CharacteristicParser(); for (Characteristic characteristic: update.getServiceCharacteristic()) { ServiceSpecCharacteristic serviceSpecCharacteristic = serviceSpecification.findSpecCharacteristicByName(characteristic.getName()); serviceSpecCharacteristic.setServiceSpecCharacteristicValue(characteristicParser.toSetOfCharacteristicValues(characteristic)); if (serviceSpecCharacteristic.getServiceSpecCharacteristicValue().stream() .anyMatch(value -> { ServiceSpecCharacteristicValueValidator serviceSpecCharacteristicValueValidator = new ServiceSpecCharacteristicValueValidator(value); return !serviceSpecCharacteristicValueValidator.validateType() || !serviceSpecCharacteristicValueValidator.isWithinRangeInterval(); })) { errors.reject("invalid.request"); return; } } } } src/test/java/org/etsi/osl/services/api/sim638/ServiceApiControllerTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -246,7 +246,7 @@ public class ServiceApiControllerTest extends BaseIT { private ServiceOrderCreate createServiceOrderWithCharacteristicValue(String characteristicValue) throws Exception { File sspec = new File("src/test/resources/testServiceSpecValidRangeInterval.json"); File sspec = new File("src/test/resources/reposervices/scm633/testServiceSpecValidRangeInterval.json"); InputStream in = new FileInputStream(sspec); String sspectext = IOUtils.toString(in, "UTF-8"); Loading Loading
src/main/java/org/etsi/osl/tmf/sim638/api/ServiceApiController.java +13 −0 Original line number Diff line number Diff line Loading @@ -30,6 +30,8 @@ import org.etsi.osl.tmf.sim638.model.ServiceCreate; import org.etsi.osl.tmf.sim638.model.ServiceUpdate; import org.etsi.osl.tmf.sim638.service.ServiceRepoService; import org.etsi.osl.tmf.util.AddUserAsOwnerToRelatedParties; import org.etsi.osl.tmf.util.ServiceInventoryValidator; import org.etsi.osl.tmf.util.ServiceSpecificationValidator; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; Loading @@ -40,6 +42,8 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.RequestMapping; import org.etsi.osl.model.nfv.UserRoleType; Loading @@ -61,6 +65,15 @@ public class ServiceApiController implements ServiceApi { @Autowired ServiceRepoService serviceRepoService; @Autowired private ServiceInventoryValidator serviceInventoryValidator; // Custom validation resulting from ServiceSpecCharacteristicValue range interval and type validation (https://labs.etsi.org/rep/groups/osl/code/-/epics/30) @InitBinder protected void initBinder(WebDataBinder binder) { binder.addValidators(serviceInventoryValidator); } @org.springframework.beans.factory.annotation.Autowired public ServiceApiController(ObjectMapper objectMapper, HttpServletRequest request) { this.objectMapper = objectMapper; Loading
src/main/java/org/etsi/osl/tmf/util/CharacteristicParser.java 0 → 100644 +48 −0 Original line number Diff line number Diff line package org.etsi.osl.tmf.util; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import org.etsi.osl.tmf.common.model.Any; import org.etsi.osl.tmf.common.model.service.Characteristic; import org.etsi.osl.tmf.scm633.model.ServiceSpecCharacteristicValue; import java.util.HashSet; import java.util.Set; import java.util.stream.Collectors; public class CharacteristicParser { private static final ObjectMapper mapper = new ObjectMapper(); public Set<ServiceSpecCharacteristicValue> toSetOfCharacteristicValues(Characteristic characteristic) { Set<ServiceSpecCharacteristicValue> result = new HashSet<>(); Any input = characteristic.getValue(); if (input == null) { return result; } try { JsonNode node = mapper.readTree(input.getValue()); if (node.isArray()) { Set<Any> values = mapper.readValue(input.getValue(), new TypeReference<Set<Any>>() {}); result = values.stream().map(value -> { ServiceSpecCharacteristicValue serviceSpecCharacteristicValue = new ServiceSpecCharacteristicValue(); serviceSpecCharacteristicValue.setValue(value); return serviceSpecCharacteristicValue; }).collect(Collectors.toSet()); } else if (node.isObject()) { ServiceSpecCharacteristicValue serviceSpecCharacteristicValue = new ServiceSpecCharacteristicValue(); serviceSpecCharacteristicValue.setValue(mapper.treeToValue(node, Any.class)); result.add(serviceSpecCharacteristicValue); } else { ServiceSpecCharacteristicValue serviceSpecCharacteristicValue = new ServiceSpecCharacteristicValue(); serviceSpecCharacteristicValue.setValue(input); result.add(serviceSpecCharacteristicValue); } } catch (Exception e) { ServiceSpecCharacteristicValue serviceSpecCharacteristicValue = new ServiceSpecCharacteristicValue(); serviceSpecCharacteristicValue.setValue(input); result.add(serviceSpecCharacteristicValue); } return result; } }
src/main/java/org/etsi/osl/tmf/util/ServiceInventoryValidator.java 0 → 100644 +46 −0 Original line number Diff line number Diff line package org.etsi.osl.tmf.util; import org.etsi.osl.tmf.common.model.service.Characteristic; import org.etsi.osl.tmf.scm633.model.ServiceSpecCharacteristic; import org.etsi.osl.tmf.scm633.model.ServiceSpecification; import org.etsi.osl.tmf.scm633.reposervices.ServiceSpecificationRepoService; import org.etsi.osl.tmf.sim638.model.ServiceUpdate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.validation.Errors; import org.springframework.validation.Validator; @Component public class ServiceInventoryValidator implements Validator { @Autowired private ServiceSpecificationRepoService serviceSpecificationRepoService; @Override public boolean supports(Class<?> clazz) { return ServiceUpdate.class.isAssignableFrom(clazz); } @Override public void validate(Object target, Errors errors) { ServiceUpdate update = (ServiceUpdate) target; if (update.getServiceCharacteristic() == null || update.getServiceSpecificationRef() == null) { return; } String serviceSpecificationId = update.getServiceSpecificationRef().getId(); ServiceSpecification serviceSpecification = serviceSpecificationRepoService.findByUuid(serviceSpecificationId); CharacteristicParser characteristicParser = new CharacteristicParser(); for (Characteristic characteristic: update.getServiceCharacteristic()) { ServiceSpecCharacteristic serviceSpecCharacteristic = serviceSpecification.findSpecCharacteristicByName(characteristic.getName()); serviceSpecCharacteristic.setServiceSpecCharacteristicValue(characteristicParser.toSetOfCharacteristicValues(characteristic)); if (serviceSpecCharacteristic.getServiceSpecCharacteristicValue().stream() .anyMatch(value -> { ServiceSpecCharacteristicValueValidator serviceSpecCharacteristicValueValidator = new ServiceSpecCharacteristicValueValidator(value); return !serviceSpecCharacteristicValueValidator.validateType() || !serviceSpecCharacteristicValueValidator.isWithinRangeInterval(); })) { errors.reject("invalid.request"); return; } } } }
src/test/java/org/etsi/osl/services/api/sim638/ServiceApiControllerTest.java +1 −1 Original line number Diff line number Diff line Loading @@ -246,7 +246,7 @@ public class ServiceApiControllerTest extends BaseIT { private ServiceOrderCreate createServiceOrderWithCharacteristicValue(String characteristicValue) throws Exception { File sspec = new File("src/test/resources/testServiceSpecValidRangeInterval.json"); File sspec = new File("src/test/resources/reposervices/scm633/testServiceSpecValidRangeInterval.json"); InputStream in = new FileInputStream(sspec); String sspectext = IOUtils.toString(in, "UTF-8"); Loading