public static Expression parse()

in core/src/main/java/org/apache/commons/jelly/expression/CompositeExpression.java [48:188]


    public static Expression parse(String text, ExpressionFactory factory) throws JellyException {

        int len = text.length();

        int startIndex = text.indexOf( "${" );

        if ( startIndex < 0) {
            return new ConstantExpression(text);
        }

        int endIndex = text.indexOf( "}", startIndex+2 );

        if ( endIndex < 0 ) {
            throw new JellyException( "Missing '}' character at the end of expression: " + text );
        }
        if ( startIndex == 0 && endIndex == len - 1 ) {
            return factory.createExpression(text.substring(2, endIndex));
        }

        CompositeExpression answer = new CompositeExpression();

        int cur = 0;
        char c = 0;

        StringBuilder chars = new StringBuilder();
        StringBuilder expr  = new StringBuilder();

      MAIN:
        while ( cur < len ) {
            c = text.charAt( cur );

            switch ( c ) {
                case('$'):
                    if ( cur+1<len ) {
                        if ( text.charAt( cur + 1 ) == '{' ) {
                        ++cur;
                        c = text.charAt( cur );

                                if ( chars.length() > 0 ) {
                                    answer.addTextExpression( chars.toString() );
                                    chars.delete(0, chars.length() );
                                }

                                if (cur+1<len) {
                                    ++cur;

                                    while (cur<len) {
                                        c = text.charAt(cur);
                                        switch ( c ) {
                                            case('"'):
                                              expr.append( c );
                                              ++cur;

                                              DOUBLE_QUOTE:
                                                while(cur<len) {
                                                    c = text.charAt(cur);

                                                    switch ( c ) {
                                                        case('\\'):
                                                            ++cur;
                                                            expr.append(c);
                                                            break;
                                                        case('"'):
                                                            ++cur;
                                                            expr.append(c);
                                                            break DOUBLE_QUOTE;
                                                        default:
                                                            ++cur;
                                                            expr.append(c);
                                                    } // switch
                                                } // while
                                                break;
                                            case('\''):
                                                expr.append( c );
                                                ++cur;

                                              SINGLE_QUOTE:
                                                while(cur<len) {
                                                    c = text.charAt(cur);

                                                    switch ( c ) {
                                                        case('\\'):
                                                            ++cur;
                                                            expr.append(c);
                                                            break;
                                                        case('\''):
                                                            ++cur;
                                                            expr.append(c);
                                                            break SINGLE_QUOTE;
                                                        default:
                                                            ++cur;
                                                            expr.append(c);
                                                    } // switch
                                                } // while
                                                break;
                                            case('}'):
                                                answer.addExpression(factory.createExpression(expr.toString()));
                                                expr.delete(0, expr.length());
                                                ++cur;
                                                continue MAIN;
                                            default:
                                                expr.append( c );
                                                ++cur;
                                        }
                                    }
                                }
                        }
                        else if ( text.charAt( cur + 1 ) == '$' ) // $$
                        {
                            chars.append( c );
                            if ( cur + 2 < len )
                            {
                                if ( text.charAt( cur + 2 ) == '{' ) // $${
                                {
                                    ++cur;
                                }
                            }
                        }
                        else
                        {
                            chars.append( c );
                        }
                    }
                    else
                    {
                        chars.append(c);
                    }
                    break;
                default:
                    chars.append( c );
            }
            ++cur;
        }

        if ( chars.length() > 0 )
        {
            answer.addTextExpression( chars.toString() );
        }

        return answer;
    }