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

software.amazon.event.ruler.input.EqualsIgnoreCaseParser Maven / Gradle / Ivy

package software.amazon.event.ruler.input;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.function.Function;

/**
 * A parser to be used specifically for equals-ignore-case rules. For Java characters where lower and upper case UTF-8
 * representations do not differ, we will parse into InputBytes. Otherwise, we will use InputMultiByteSet.
 *
 * Note that there are actually characters whose upper-case/lower-case UTF-8 representations differ in number of bytes.
 * One example where length differs by 1: ⱥ, Ⱥ
 * One example where length differs by 4: ΰ, Ϋ́
 * InputMultiByteSet handles differing byte lengths per Java character.
 */
public class EqualsIgnoreCaseParser {

    EqualsIgnoreCaseParser() { }

    public InputCharacter[] parse(String value) {
        return parse(value, false);
    }

    protected InputCharacter[] parse(String value, boolean reverseCharBytes) {
        List result = new ArrayList<>(value.length());
        for (char c : value.toCharArray()) {
            byte[] lowerCaseUtf8bytes = getCharUtfBytes(c, (ch) -> ch.toLowerCase(Locale.ROOT), reverseCharBytes);
            byte[] upperCaseUtf8bytes = getCharUtfBytes(c, (ch) -> ch.toUpperCase(Locale.ROOT), reverseCharBytes);
            if (Arrays.equals(lowerCaseUtf8bytes, upperCaseUtf8bytes)) {
                for (int i = 0; i < lowerCaseUtf8bytes.length; i++) {
                    result.add(new InputByte(lowerCaseUtf8bytes[i]));
                }
            } else {
                Set multiBytes = new HashSet<>();
                multiBytes.add(new MultiByte(lowerCaseUtf8bytes));
                multiBytes.add(new MultiByte(upperCaseUtf8bytes));
                result.add(new InputMultiByteSet(multiBytes));
            }
        }
        return result.toArray(new InputCharacter[0]);
    }

    private static byte[] getCharUtfBytes(char c, Function stringTransformer, boolean reverseCharBytes) {
        byte[] byteArray = stringTransformer.apply(String.valueOf(c)).getBytes(StandardCharsets.UTF_8);
        if (reverseCharBytes) {
            return reverseByteArray(byteArray);
        }
        return byteArray;
    }

    private static byte[] reverseByteArray(byte[] byteArray) {
        byte[] reversedByteArray = new byte[byteArray.length];
        for (int i = 0; i < byteArray.length; i++) {
            reversedByteArray[i] = byteArray[byteArray.length - i - 1];
        }
        return reversedByteArray;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy