package com.sequenceiq.cloudbreak.converter; import java.util.regex.Pattern; import org.springframework.stereotype.Component; import com.sequenceiq.cloudbreak.api.model.SecurityRuleRequest; import com.sequenceiq.cloudbreak.controller.BadRequestException; import com.sequenceiq.cloudbreak.domain.SecurityRule; @Component public class JsonToSecurityRuleConverter extends AbstractConversionServiceAwareConverter<SecurityRuleRequest, SecurityRule> { private static final String PORT_REGEX = "^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])" + "(-([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5]))?$"; private static final int MIN_RANGE = 1; private static final int MAX_RANGE = 65535; @Override public SecurityRule convert(SecurityRuleRequest json) { SecurityRule entity = new SecurityRule(); entity.setCidr(json.getSubnet()); String ports = json.getPorts(); validatePorts(ports); entity.setPorts(ports); entity.setProtocol(json.getProtocol()); entity.setModifiable(json.isModifiable()); return entity; } private void validatePorts(String ports) { for (String portString : ports.split(",")) { if (!Pattern.matches(PORT_REGEX, portString)) { throw new BadRequestException(String.format("Ports must be in range of %d-%d", MIN_RANGE, MAX_RANGE)); } } } }