protected ExpressionStruct parseExpressionStruct()

in saga/seata-saga-engine/src/main/java/org/apache/seata/saga/engine/expression/impl/DefaultExpressionResolver.java [55:100]


    protected ExpressionStruct parseExpressionStruct(String expressionStr) {
        ExpressionStruct struct = new ExpressionStruct();
        struct.typeStart = expressionStr.indexOf("$");
        int dot = expressionStr.indexOf(".", struct.typeStart);
        int leftBracket = expressionStr.indexOf("{", struct.typeStart);


        boolean isOldEvaluatorStyle = false;
        if (struct.typeStart == 0) {
            if (leftBracket < 0 && dot < 0) {
                throw new IllegalArgumentException(String.format("Expression [%s] type is not closed", expressionStr));
            }
            // Backward compatible for structure: $expressionType{expressionContent}
            if (leftBracket > 0 && (leftBracket < dot || dot < 0)) {
                struct.typeEnd = leftBracket;
                isOldEvaluatorStyle = true;
            }
            if (dot > 0 && (dot < leftBracket || leftBracket < 0)) {
                struct.typeEnd = dot;
            }
        }

        if (struct.typeStart == 0 && leftBracket != -1 && leftBracket < dot) {
            // Backward compatible for structure: $expressionType{expressionContent}
            struct.typeEnd = expressionStr.indexOf("{", struct.typeStart);
            isOldEvaluatorStyle = true;
        }

        // No $ indicator denotes default type
        if (struct.typeStart != 0) {
            struct.typeStart = struct.typeEnd = -1;
            struct.type = null;
        } else {
            struct.type = expressionStr.substring(struct.typeStart + 1, struct.typeEnd);
        }

        if (isOldEvaluatorStyle) {
            struct.end = expressionStr.indexOf("}", struct.typeEnd);
        } else {
            struct.end = expressionStr.length();
        }

        struct.content = expressionStr.substring(struct.typeEnd + 1, struct.end);

        return struct;
    }