public String prepareString()

in server/core/src/main/java/org/apache/vysper/xmpp/addressing/stringprep/StringPrep.java [64:102]


    public String prepareString(String str) throws StringPrepViolationException {
        // 1. map -> RFC3454:3
        for (int i = 0; i < str.length(); i++) {
            String codePoint = codePointAt(str, i);
            if (mapping.containsKey(codePoint)) {
                str = str.replace(codePoint, mapping.get(codePoint));
            }
        }
        // TODO: 2. normalize -> RFC3454:4

        // 3. prohibit -> RFC3454:5
        for (int i = 0; i < str.length(); i++) {
            String codePoint = codePointAt(str, i);
            if (prohibited.contains(codePoint)) {
                throw new StringPrepViolationException(String.format("character '%s' prohibited!", codePoint));
            }
        }

        // 4. check bidi -> RFC3454:6
        boolean containsRAndAlCat = false;
        boolean containsLCat = false;
        for (int i = 0; i < str.length() && NAND(containsRAndAlCat, containsLCat); i++) {
            String codePoint = codePointAt(str, i);
            containsRAndAlCat |= StringPrepConstants.D_1_CharactersWithBiDiPropertiesRorAl.contains(codePoint);
            containsLCat |= StringPrepConstants.D_2_CharactersWithBiDiPropertyL.contains(codePoint);
        }
        if (containsRAndAlCat && containsLCat) {
            throw new StringPrepViolationException("invalid bidi sequence");
        }
        if (containsRAndAlCat) {
            if (!StringPrepConstants.D_1_CharactersWithBiDiPropertiesRorAl.contains(codePointAt(str, 0))
                    || !StringPrepConstants.D_1_CharactersWithBiDiPropertiesRorAl.contains(codePointAt(str, str
                            .length() - 1))) {
                throw new StringPrepViolationException("invalid bidi sequence");
            }
        }

        return str;
    }