private static List codeAwareSplitOnChar()

in drools-util/src/main/java/org/drools/util/StringUtils.java [1041:1097]


    private static List<String> codeAwareSplitOnChar(CharSequence string, boolean useAngularParenthesis, boolean trimArgs, char... chs) {
        List<String> args = new ArrayList<>();
        int lastStart = 0;
        int nestedParam = 0;
        boolean isSingleQuoted = false;
        boolean isDoubleQuoted = false;
        for (int i = 0; i < string.length(); i++) {
            if (contains(chs, string.charAt( i ))) {
                if (!isSingleQuoted && !isDoubleQuoted && nestedParam == 0) {
                    String arg = string.subSequence(lastStart, i).toString();
                    args.add(trimArgs ? arg.trim() : arg);
                    lastStart = i+1;
                }
            } else {
                switch (string.charAt(i)) {
                    case '(':
                    case '[':
                    case '{':
                        if (!isSingleQuoted && !isDoubleQuoted) nestedParam++;
                        break;
                    case '<':
                        if (useAngularParenthesis && !isSingleQuoted && !isDoubleQuoted) nestedParam++;
                        break;
                    case ')':
                    case ']':
                    case '}':
                        if (!isSingleQuoted && !isDoubleQuoted) nestedParam--;
                        break;
                    case '>':
                        if (useAngularParenthesis && !isSingleQuoted && !isDoubleQuoted) nestedParam--;
                        break;
                    case '"':
                        if (!isSingleQuoted && (i == 0 || string.charAt(i-1) != '\\')) {
                            isDoubleQuoted = !isDoubleQuoted;
                        }
                        break;
                    case '\'':
                        if (!isDoubleQuoted && (i == 0 || string.charAt(i-1) != '\\')) {
                            isSingleQuoted = !isSingleQuoted;
                        }
                        break;
                    case '\\':
                        if (i+1 < string.length() && string.charAt(i+1) == '"') {
                            i++;
                        }
                        break;

                }
            }
        }
        String arg = string.subSequence(lastStart, string.length()).toString();
        String lastArg = trimArgs ? arg.trim() : arg;
        if (lastArg.length() > 0) {
            args.add(lastArg);
        }
        return args;
    }