Commit f9333b63 authored by Kostis Trantzas's avatar Kostis Trantzas
Browse files

Merge branch '91-range-interval-type-validation' into 'develop'

Implemented range interval validation and type validation for Service...

See merge request !89
parents 42afcc30 1347e4e4
Loading
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;
+12 −4
Original line number Diff line number Diff line
@@ -32,6 +32,7 @@ import org.etsi.osl.tmf.so641.model.ServiceOrderCreate;
import org.etsi.osl.tmf.so641.model.ServiceOrderUpdate;
import org.etsi.osl.tmf.so641.reposervices.ServiceOrderRepoService;
import org.etsi.osl.tmf.util.AddUserAsOwnerToRelatedParties;
import org.etsi.osl.tmf.util.ServiceOrderValidator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -46,10 +47,8 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.jwt.Jwt;
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.*;

import org.etsi.osl.model.nfv.UserRoleType;
import io.swagger.v3.oas.annotations.Parameter;
@@ -79,6 +78,15 @@ public class ServiceOrderApiController implements ServiceOrderApi {
	@Autowired
	ServiceOrderApiRouteBuilder serviceOrderApiRouteBuilder;

	@Autowired
	private ServiceOrderValidator serviceOrderValidator;

	// 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(serviceOrderValidator);
	}

	@org.springframework.beans.factory.annotation.Autowired
	public ServiceOrderApiController(ObjectMapper objectMapper, HttpServletRequest request) {
		this.objectMapper = objectMapper;
+47 −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.Set;
import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

public class CharacteristicParser {
    private static final ObjectMapper mapper = new ObjectMapper();

    public void updateServiceSpecCharacteristicValues(
            Set<ServiceSpecCharacteristicValue> serviceSpecCharacteristicValues,
            Characteristic characteristic
    ) {
        Any input = characteristic.getValue();
        if (input == null) {
            return;
        }
        List<Any> values = new ArrayList<>();
        try {
            JsonNode node = mapper.readTree(input.getValue());
            if (node.isArray()) {
                values = mapper.readValue(input.getValue(), new TypeReference<>() {});
            } else if (node.isObject()) {
                values.add(mapper.treeToValue(node, Any.class));
            } else {
                values.add(input);
            }
        } catch (Exception e) {
            values.add(input);
        }
        Iterator<ServiceSpecCharacteristicValue> serviceSpecCharacteristicValueIterator = serviceSpecCharacteristicValues.iterator();
        Iterator<Any> valueIterator = values.iterator();
        while (serviceSpecCharacteristicValueIterator.hasNext() && valueIterator.hasNext()) {
            ServiceSpecCharacteristicValue serviceSpecCharacteristicValue = serviceSpecCharacteristicValueIterator.next();
            Any value = valueIterator.next();
            serviceSpecCharacteristicValue.setValue(value);
        }
    }
}
+50 −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.ServiceSpecCharacteristicValue;
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;

import java.util.Set;

@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());
            if (serviceSpecCharacteristic != null) {
                Set<ServiceSpecCharacteristicValue> serviceSpecCharacteristicValues = serviceSpecCharacteristic.getServiceSpecCharacteristicValue();
                characteristicParser.updateServiceSpecCharacteristicValues(serviceSpecCharacteristicValues, characteristic);
                if (serviceSpecCharacteristicValues.stream().anyMatch(value -> {
                        ServiceSpecCharacteristicValueValidator serviceSpecCharacteristicValueValidator = new ServiceSpecCharacteristicValueValidator(value);
                        return !serviceSpecCharacteristicValueValidator.validateType() || !serviceSpecCharacteristicValueValidator.isWithinRangeInterval();
                })) {
                    errors.reject("invalid.request");
                    return;
                }
            }
        }
    }
}
+62 −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.ServiceSpecCharacteristicValue;
import org.etsi.osl.tmf.scm633.model.ServiceSpecification;
import org.etsi.osl.tmf.scm633.reposervices.ServiceSpecificationRepoService;
import org.etsi.osl.tmf.so641.model.ServiceOrderCreate;
import org.etsi.osl.tmf.so641.model.ServiceOrderItem;
import org.etsi.osl.tmf.so641.model.ServiceOrderUpdate;
import org.etsi.osl.tmf.so641.model.ServiceRestriction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

import java.util.Set;

@Component
public class ServiceOrderValidator implements Validator {
    @Autowired
    private ServiceSpecificationRepoService serviceSpecificationRepoService;

    @Override
    public boolean supports(Class<?> clazz) {
        return ServiceOrderCreate.class.isAssignableFrom(clazz) || ServiceOrderUpdate.class.isAssignableFrom(clazz);
    }

    @Override
    public void validate(Object target, Errors errors) {
        if (!(target instanceof ServiceOrderCreate)) {
            return;
        }
        ServiceOrderCreate create = (ServiceOrderCreate) target;
        for (ServiceOrderItem orderItem: create.getOrderItem()) {
            if (orderItem.getService() == null) {
                return;
            }
            ServiceRestriction service = orderItem.getService();
            if (service.getServiceCharacteristic() == null || service.getServiceSpecification() == null) {
                return;
            }
            String serviceSpecificationId = service.getServiceSpecification().getId();
            ServiceSpecification serviceSpecification = serviceSpecificationRepoService.findByUuid(serviceSpecificationId);
            CharacteristicParser characteristicParser = new CharacteristicParser();
            for (Characteristic characteristic: service.getServiceCharacteristic()) {
                ServiceSpecCharacteristic serviceSpecCharacteristic = serviceSpecification.findSpecCharacteristicByName(characteristic.getName());
                if (serviceSpecCharacteristic != null) {
                    Set<ServiceSpecCharacteristicValue> serviceSpecCharacteristicValues = serviceSpecCharacteristic.getServiceSpecCharacteristicValue();
                    characteristicParser.updateServiceSpecCharacteristicValues(serviceSpecCharacteristicValues, characteristic);
                    if (serviceSpecCharacteristicValues.stream().anyMatch(value -> {
                            ServiceSpecCharacteristicValueValidator serviceSpecCharacteristicValueValidator = new ServiceSpecCharacteristicValueValidator(value);
                            return !serviceSpecCharacteristicValueValidator.validateType() || !serviceSpecCharacteristicValueValidator.isWithinRangeInterval();
                    })) {
                        errors.reject("invalid.request");
                        return;
                    }
                }
            }
        }
    }
}
Loading