Commit 1044db62 authored by Diogo Santos's avatar Diogo Santos
Browse files

ServiceInventory Validator and fixed resource path in tests

parent 795de27c
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -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;
@@ -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;
@@ -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;
+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;
    }
}
+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;
            }
        }
    }
}
+1 −1
Original line number Diff line number Diff line
@@ -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");