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

kr.jm.metric.mutator.DelimiterMutator Maven / Gradle / Ivy

package kr.jm.metric.mutator;

import kr.jm.metric.config.mutator.DelimiterMutatorConfig;
import kr.jm.utils.exception.JMExceptionManager;
import kr.jm.utils.helper.JMOptional;
import kr.jm.utils.helper.JMStream;
import lombok.ToString;

import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

@ToString(callSuper = true)
public class DelimiterMutator extends
        AbstractMutator {

    public static final String DefaultIndexHeader = "Index-";
    protected String[] fields;
    private Pattern splitPattern;
    private Pattern discardPattern;

    public DelimiterMutator() {
        this(new DelimiterMutatorConfig("Delimiter"));
    }

    public DelimiterMutator(DelimiterMutatorConfig mutatorConfig) {
        super(mutatorConfig);
        this.splitPattern = Pattern.compile(JMOptional.getOptional(mutatorConfig
                .getDelimiterRegex()).orElse("\\s+"));
        JMOptional.getOptional(mutatorConfig.getFields())
                .ifPresent(fields -> this.fields = fields);
        Optional.ofNullable(mutatorConfig.getDiscardRegex())
                .map(Pattern::compile)
                .ifPresent(pattern -> this.discardPattern = pattern);
    }

    @Override
    public Map buildFieldObjectMap(String targetString) {
        try {
            return buildFieldObjectMap(
                    applyDiscardRegex(splitPattern.split(targetString)));
        } catch (Exception e) {
            return JMExceptionManager
                    .handleExceptionAndReturn(log, e, "buildFieldObjectMap",
                            Collections::emptyMap, Arrays.toString(fields),
                            splitPattern, discardPattern, targetString);
        }
    }

    protected Map buildFieldObjectMap(String[] splitValues) {
        return buildFieldObjectMap(getFields(splitValues), splitValues);
    }

    private Map buildFieldObjectMap(String[] fields,
            String[] values) {
        if (fields.length > values.length)
            throw new RuntimeException("Wrong Fields Or Values !!!");
        return JMStream.increaseRange(fields.length).boxed()
                .collect(Collectors.toMap(i -> fields[i], i -> values[i]));
    }

    private String[] getFields(String[] splitValues) {
        return JMOptional.getOptional(this.fields).orElseGet(
                () -> this.fields = JMStream.increaseRange(splitValues.length)
                        .mapToObj(i -> DefaultIndexHeader + i)
                        .toArray(String[]::new));
    }

    private String[] applyDiscardRegex(String[] values) {
        return Objects.nonNull(this.discardPattern) ? Arrays.stream(values)
                .map(this::applyDiscardRegex).toArray(String[]::new) : values;
    }

    private String applyDiscardRegex(String keyValueString) {
        return this.discardPattern.matcher(keyValueString).replaceAll("");
    }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy