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

io.virtdata.basicsmappers.from_long.to_string.Template Maven / Gradle / Ivy

package io.virtdata.basicsmappers.from_long.to_string;

import io.virtdata.annotations.ThreadSafeMapper;

import java.util.ArrayList;
import java.util.List;
import java.util.function.LongFunction;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

@ThreadSafeMapper
public class Template implements LongFunction {
    private static final String EXPR_BEGIN = "[[";
    private static final String EXPR_END = "]]";

    private String[] literals;
    private LongFunction[] funcs;
    private final String rawTemplate;
    private final static ThreadLocal sb = ThreadLocal.withInitial(StringBuilder::new);

    public Template(String template, LongFunction... funcs) {
        this.rawTemplate = template;
        this.funcs = funcs;
        this.literals = parseTemplate(template);
    }

    @SuppressWarnings("unchecked")
    private String[] parseTemplate(String rawTemplate) {
        try {
            List literals = new ArrayList<>();
            Pattern p = Pattern.compile("\\{}");
            Matcher m = p.matcher(rawTemplate);
            int pos=0;
            while (m.find()) {
                literals.add(rawTemplate.substring(pos,m.start()));
                pos = m.end();
            }
            literals.add(rawTemplate.substring(pos));
//            literals.addAll(Arrays.asList(rawTemplate.split("\\{}")));
            if (literals.size()!=funcs.length+1) {
                throw new RuntimeException("The number of {} place holders in '" + rawTemplate + "' should equal the number of functions.");
            }
            return literals.toArray(new String[0]);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public String apply(long value) {
        StringBuilder buffer = sb.get();
        buffer.setLength(0);
        buffer.append(literals[0]);
        if (literals.length > 1) {
            for (int i = 1; i < literals.length; i++) {
                String genString = String.valueOf(funcs[i - 1].apply(value));
                buffer.append(genString);
                buffer.append(literals[i]);
            }
        }
        return buffer.toString();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy