All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sportradar.unifiedodds.sdk.impl.markets.mappings.MappingValidatorFactoryImpl Maven / Gradle / Ivy

/*
 * Copyright (C) Sportradar AG. See LICENSE for full license governing this code
 */

package com.sportradar.unifiedodds.sdk.impl.markets.mappings;

import com.google.common.base.Preconditions;
import com.sportradar.unifiedodds.sdk.impl.markets.MappingValidator;
import com.sportradar.unifiedodds.sdk.impl.markets.MappingValidatorFactory;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;


/**
 * A {@link MappingValidatorFactory} used to construct {@link MappingValidator} instances
 */
public class MappingValidatorFactoryImpl implements MappingValidatorFactory{

    /**
     * A regex pattern used to detect validators requiring specific decimal value
     */
    private static final Pattern decimalPatternRegex = Pattern.compile("\\A\\*\\.\\d{1,2}\\z");

    /**
     * Constructs and returns a {@link MappingValidator} for a single specifier
     * @param name The name of the specifier
     * @param value The required value or required value format
     * @return A {@link MappingValidator} constructed from provided data
     */
    private static MappingValidator buildSingle(String name, String value){
        Preconditions.checkArgument(name != null && !name.isEmpty(), "name cannot be a null reference or an empty string");
        Preconditions.checkArgument(value != null && !value.isEmpty(), "value cannot be a null reference or an empty string");

        Matcher matcher = decimalPatternRegex.matcher(value);
        return matcher.find()
                ? new DecimalValueMappingValidator(name, new BigDecimal(value.replace("*", "0")))
                : new SpecificValueMappingValidator(name, value);
    }

    /**
     * Builds and returns a {@link MappingValidator} from it's string representation
     *
     * @param validatorString A string representation of the mapping validator
     * @return A {@link MappingValidator} build from it's string representation
     */
    @Override
    public MappingValidator build(String validatorString) {
        Preconditions.checkArgument(validatorString != null && ! validatorString.isEmpty(), "validatiorString cannot be a null reference or an empty string");

        Map specifiers = split(validatorString);

        if(specifiers.size() == 1){
            String firstKey = specifiers.keySet().iterator().next();
            return buildSingle(firstKey, specifiers.get(firstKey));
        }

        List validators = new ArrayList<>(specifiers.size());
        for(String key : specifiers.keySet()){
            validators.add(buildSingle(key, specifiers.get(key)));
        }
        return new CompositeMappingValidator(validators);

    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy