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;
}