1 16 package org.springframework.binding.expression.support; 17 18 import java.util.LinkedList ; 19 import java.util.List ; 20 21 import org.springframework.binding.expression.Expression; 22 import org.springframework.binding.expression.ExpressionParser; 23 import org.springframework.binding.expression.ParserException; 24 import org.springframework.binding.expression.SettableExpression; 25 import org.springframework.util.StringUtils; 26 27 31 public abstract class AbstractExpressionParser implements ExpressionParser { 32 33 36 private static final String DEFAULT_EXPRESSION_PREFIX = "${"; 37 38 41 private static final String DEFAULT_EXPRESSION_SUFFIX = "}"; 42 43 46 private String expressionPrefix = DEFAULT_EXPRESSION_PREFIX; 47 48 51 private String expressionSuffix = DEFAULT_EXPRESSION_SUFFIX; 52 53 56 public String getExpressionPrefix() { 57 return expressionPrefix; 58 } 59 60 63 public void setExpressionPrefix(String expressionPrefix) { 64 this.expressionPrefix = expressionPrefix; 65 } 66 67 70 public String getExpressionSuffix() { 71 return expressionSuffix; 72 } 73 74 77 public void setExpressionSuffix(String expressionSuffix) { 78 this.expressionSuffix = expressionSuffix; 79 } 80 81 84 public boolean isDelimitedExpression(String expressionString) { 85 int prefixIndex = expressionString.indexOf(getExpressionPrefix()); 86 if (prefixIndex == -1) { 87 return false; 88 } 89 int suffixIndex = expressionString.indexOf(getExpressionSuffix(), prefixIndex); 90 if (suffixIndex == -1) { 91 return false; 92 } else { 93 if (suffixIndex == prefixIndex + getExpressionPrefix().length()) { 94 return false; 95 } else { 96 return true; 97 } 98 } 99 } 100 101 public final Expression parseExpression(String expressionString) throws ParserException { 102 Expression[] expressions = parseExpressions(expressionString); 103 if (expressions.length == 1) { 104 return expressions[0]; 105 } else { 106 return new CompositeStringExpression(expressions); 107 } 108 } 109 110 public abstract SettableExpression parseSettableExpression(String expressionString) throws ParserException, 111 UnsupportedOperationException ; 112 113 124 private Expression[] parseExpressions(String expressionString) throws ParserException { 125 List expressions = new LinkedList (); 126 if (StringUtils.hasText(expressionString)) { 127 int startIdx = 0; 128 while (startIdx < expressionString.length()) { 129 int prefixIndex = expressionString.indexOf(getExpressionPrefix(), startIdx); 130 if (prefixIndex >= startIdx) { 131 if (prefixIndex > startIdx) { 133 expressions.add(new StaticExpression(expressionString.substring(startIdx, prefixIndex))); 134 startIdx = prefixIndex; 135 } 136 int suffixIndex = expressionString.indexOf(getExpressionSuffix(), prefixIndex); 137 if (suffixIndex == -1) { 138 throw new ParserException(expressionString, null, "No ending suffix '" + getExpressionSuffix() 139 + "' for expression starting at character " + prefixIndex + ": " 140 + expressionString.substring(prefixIndex)); 141 } else if (suffixIndex == prefixIndex + getExpressionPrefix().length()) { 142 throw new ParserException(expressionString, null, "No expression defined within delimiter '" 143 + getExpressionPrefix() + getExpressionSuffix() + "' at character " + prefixIndex); 144 } else { 145 String expr = expressionString.substring(prefixIndex + getExpressionPrefix().length(), 146 suffixIndex); 147 expressions.add(doParseExpression(expr)); 148 startIdx = suffixIndex + 1; 149 } 150 } else { 151 if (startIdx == 0) { 152 expressions.add(doParseExpression(expressionString)); 154 } else { 155 expressions.add(new StaticExpression(expressionString.substring(startIdx))); 157 } 158 startIdx = expressionString.length(); 159 } 160 } 161 } else { 162 expressions.add(new StaticExpression(expressionString)); 163 } 164 return (Expression[]) expressions.toArray(new Expression[expressions.size()]); 165 } 166 167 173 protected abstract Expression doParseExpression(String expressionString); 174 175 } | Popular Tags |