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

io.github.qudtlib.support.fractional.FractionalUnits Maven / Gradle / Ivy

package io.github.qudtlib.support.fractional;

import io.github.qudtlib.Qudt;
import io.github.qudtlib.exception.NotFoundException;
import io.github.qudtlib.model.FactorUnit;
import io.github.qudtlib.model.Unit;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FractionalUnits {

    public static FractionalDimensionVector getFractionalDimensionVector(Unit unit) {
        String[] unitNameConstituents = getIriLocalname(unit.getIri()).split("-");
        List numerator = new ArrayList<>();
        List denominator = new ArrayList<>();
        List currentFactors = numerator;
        for (String currentUnitNameConstituent : unitNameConstituents) {
            FactorUnit found = null;
            if (currentUnitNameConstituent.equals("PER")) {
                currentFactors = denominator;
                continue;
            }
            Pattern p = Pattern.compile("(.+)(-?\\d)?");
            Matcher m = p.matcher(currentUnitNameConstituent);
            if (!m.find()) {
                throw new RuntimeException(
                        String.format(
                                "Name particle %s of unit %s does not seem to be a factor unit",
                                currentUnitNameConstituent, unit.getIri()));
            }
            String unitName = m.group(1);
            Unit currentFactorUnit = null;
            try {
                currentFactorUnit = Qudt.unitFromLocalnameRequired(unitName);
            } catch (NotFoundException e) {
                try {
                    currentFactorUnit = Qudt.currencyFromLocalnameRequired(unitName);
                } catch (NotFoundException e2) {
                    throw new RuntimeException(
                            String.format(
                                    "Name particle %s of unit %s is not a QUDT unit or currency",
                                    currentUnitNameConstituent, unit.getIri()),
                            e2);
                }
            }
            String exponentStr = m.group(2);
            int currentExponent = 1;
            if (exponentStr != null) {
                currentExponent = Integer.valueOf(exponentStr);
            }
            currentExponent = Math.abs(currentExponent);
            currentFactors.add(new FactorUnit(currentFactorUnit, currentExponent));
        }
        return new FractionalDimensionVector(numerator, denominator);
    }

    private static String getIriLocalname(String iri) {
        if (iri == null) {
            return null;
        }
        for (int i = iri.length(); i >= 0; i--) {
            Character ch = iri.charAt(i - 1);
            if (ch == '/' || ch == '#') {
                return iri.substring(i);
            }
        }
        return "";
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy