Author: andrei_exadel
Date: 2008-10-16 07:14:31 -0400 (Thu, 16 Oct 2008)
New Revision: 10772
Modified:
trunk/ui/columns/src/main/java/org/richfaces/el/ELBuilder.java
trunk/ui/columns/src/main/java/org/richfaces/taglib/ColumnsHandler.java
trunk/ui/columns/src/main/java/org/richfaces/taglib/ColumnsTag.java
trunk/ui/columns/src/test/java/org/richfaces/el/ELBuilderTest.java
Log:
Columns: fix EL Builder
Modified: trunk/ui/columns/src/main/java/org/richfaces/el/ELBuilder.java
===================================================================
--- trunk/ui/columns/src/main/java/org/richfaces/el/ELBuilder.java 2008-10-16 11:01:58 UTC
(rev 10771)
+++ trunk/ui/columns/src/main/java/org/richfaces/el/ELBuilder.java 2008-10-16 11:14:31 UTC
(rev 10772)
@@ -24,10 +24,10 @@
Log log = LogFactory.getLog(ELBuilder.class);
/** Original value expression string */
- String orig;
+ String [] orig;
/** Result buffer */
- StringBuffer res = new StringBuffer("#{");
+ StringBuffer res = new StringBuffer();
int l;
@@ -47,7 +47,9 @@
int indexL;
+ boolean isLiteral;
+ String postFix;
/**
* Constructor
@@ -59,12 +61,11 @@
*/
public ELBuilder(String orig, String var, String index, String varR,
String indexR) {
- this.orig = trimEL(orig);
+ this.orig = orig.split("#");
this.var = var;
this.index = index;
this.varReplacement = varR;
this.indexReplacement = indexR;
- l = this.orig.length();
varL = var.length();
indexL = index.length();
@@ -76,8 +77,20 @@
*/
public String parse() {
try {
- internalParse(orig);
- res.append("}");
+ for (String s : orig) {
+ if (s != null && s.trim().length() > 0) {
+ String trim = trimEL(s);
+ if (!isLiteral) {
+ l = trim.length();
+ res.append("#{");
+ internalParse(trim);
+ res.append("}");
+ res.append(postFix);
+ }else {
+ res.append(s);
+ }
+ }
+ }
}catch (Exception e) {
log.error("Error occured during ValueExpression parsing. Keep old expression.
" + e);
res.append(orig);
@@ -105,18 +118,44 @@
}
/**
- * Removes '#', '{', '}' chars from expression
+ * Evaluates expression body
* @param orig - original expression
* @return
*/
- public static String trimEL(String orig) {
- if (orig.trim().startsWith("#")) {
- orig = orig.substring(1).trim();
- if (orig.startsWith("{") && orig.endsWith("}")) {
- orig = orig.substring(1, orig.length() - 1);
+ private String trimEL(String orig) {
+ int end = orig.lastIndexOf("}");
+ if (orig.startsWith("{") && end != -1) {
+ isLiteral = false;
+ postFix = (end + 1 < orig.length()) ? orig.substring(end + 1) : "";
+ return orig.substring(1, end);
+ }
+ isLiteral = true;
+ return orig;
+ }
+
+ /**
+ * Returns var replacement
+ * @param expr
+ * @return
+ */
+ public static String getVarReplacement(String expr) {
+ int start = 0;
+ int end = 0;
+ int l = expr.length();
+ boolean f = false;
+ boolean f2 = true;
+ for (int i = 0; i < l; i++) {
+ char c = expr.charAt(i);
+ if (c == '#') {
+ f = true;
+ }else if (c == '}') {
+ end = i;
+ }else if (c == '{' && f && f2) {
+ start = (i + 1 < l) ? i + 1 : i;
+ f2 = false;
}
}
- return orig;
+ return (end > start) ? expr.substring(start, end) : null;
}
private int internalParse(String s) {
@@ -127,11 +166,11 @@
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == firstIndex) {
- i = parseIndex(i, c);
+ i = parseIndex(s, i, c);
} else if (c == firstVar) {
- i = parseVar(i, c);
+ i = parseVar(s, i, c);
} else if (isQuote(c)) {
- i = parseString(i, c);
+ i = parseString(s, i, c);
} else {
res.append(c);
}
@@ -139,10 +178,10 @@
return 0;
}
- private int parseIndex(int i, char c) {
- if (orig.indexOf(index, i) == i) {
- Character before = (i != 0) ? orig.charAt(i - 1) : null;
- Character after = (i + indexL < l) ? orig.charAt(i + indexL) : null;
+ private int parseIndex(String s, int i, char c) {
+ if (s.indexOf(index, i) == i) {
+ Character before = (i != 0) ? s.charAt(i - 1) : null;
+ Character after = (i + indexL < l) ? s.charAt(i + indexL) : null;
if (isIndex(c, before, after)) {
res.append(indexReplacement);
return i + indexL - 1;
@@ -155,10 +194,10 @@
return i;
}
- private int parseVar(int i, char c) {
- if (orig.indexOf(var, i) == i) {
- Character before = (i != 0) ? orig.charAt(i - 1) : null;
- Character after = (i + varL < l) ? orig.charAt(i + varL) : null;
+ private int parseVar(String s, int i, char c) {
+ if (s.indexOf(var, i) == i) {
+ Character before = (i != 0) ? s.charAt(i - 1) : null;
+ Character after = (i + varL < l) ? s.charAt(i + varL) : null;
if (isVar(c, before, after)) {
res.append(varReplacement);
return i + varL - 1;
@@ -171,14 +210,14 @@
return i;
}
- private int parseString(int i, char c) {
- res.append(orig.charAt(i));
+ private int parseString(String s, int i, char c) {
+ res.append(s.charAt(i));
int j = i++;
while (j < l) {
- if (isQuote(orig.charAt(j))) {
+ if (isQuote(s.charAt(j))) {
break;
} else {
- res.append(orig.charAt(j));
+ res.append(s.charAt(j));
}
j++;
}
Modified: trunk/ui/columns/src/main/java/org/richfaces/taglib/ColumnsHandler.java
===================================================================
--- trunk/ui/columns/src/main/java/org/richfaces/taglib/ColumnsHandler.java 2008-10-16
11:01:58 UTC (rev 10771)
+++ trunk/ui/columns/src/main/java/org/richfaces/taglib/ColumnsHandler.java 2008-10-16
11:14:31 UTC (rev 10772)
@@ -198,7 +198,7 @@
try {
this.value = getAttribute("value");
- itContext.valueExpr = ELBuilder.trimEL(this.value.getValue());
+ itContext.valueExpr = ELBuilder.getVarReplacement(this.value.getValue());
// produce the right sort of ForEachIterator
if (value != null) {
Modified: trunk/ui/columns/src/main/java/org/richfaces/taglib/ColumnsTag.java
===================================================================
--- trunk/ui/columns/src/main/java/org/richfaces/taglib/ColumnsTag.java 2008-10-16
11:01:58 UTC (rev 10771)
+++ trunk/ui/columns/src/main/java/org/richfaces/taglib/ColumnsTag.java 2008-10-16
11:14:31 UTC (rev 10772)
@@ -402,7 +402,7 @@
} else if (items.getVarReplacement() != null) {
return items.getVarReplacement();
}
- String varReplacement = ELBuilder.trimEL(this.__value.getExpressionString())
+ String varReplacement =
ELBuilder.getVarReplacement(this.__value.getExpressionString())
+ "[" + index + "]";
return varReplacement;
}
Modified: trunk/ui/columns/src/test/java/org/richfaces/el/ELBuilderTest.java
===================================================================
--- trunk/ui/columns/src/test/java/org/richfaces/el/ELBuilderTest.java 2008-10-16 11:01:58
UTC (rev 10771)
+++ trunk/ui/columns/src/test/java/org/richfaces/el/ELBuilderTest.java 2008-10-16 11:14:31
UTC (rev 10772)
@@ -41,6 +41,9 @@
indexR = "1";
origList = new ArrayList<String>();
+ origList.add("#{}");
+ origList.add("#{column}");
+ origList.add("#{index}");
origList.add("#{column.header}");
origList.add("#{var[index]}");
origList.add("#{bean.filterValue[index]}");
@@ -48,8 +51,17 @@
origList.add("#{var.column.index == 1}");
origList.add("#{index + 11 == 12}");
origList.add("#{var[index*2].index == column[index].index}");
+ origList.add("Active column: #{index}");
+ origList.add("Active name: #{column.name}");
+ origList.add("#{column} text #{index}");
+ origList.add("#{column.index} #{bean.name[index] == 'index'}");
+
+
resultList = new ArrayList<String>();
+ resultList.add("#{}");
+ resultList.add("#{bean.columns[0]}");
+ resultList.add("#{1}");
resultList.add("#{bean.columns[0].header}");
resultList.add("#{var[1]}");
resultList.add("#{bean.filterValue[1]}");
@@ -57,6 +69,10 @@
resultList.add("#{var.column.index == 1}");
resultList.add("#{1 + 11 == 12}");
resultList.add("#{var[1*2].index == bean.columns[0][1].index}");
+ resultList.add("Active column: #{1}");
+ resultList.add("Active name: #{bean.columns[0].name}");
+ resultList.add("#{bean.columns[0]} text #{1}");
+ resultList.add("#{bean.columns[0].index} #{bean.name[1] ==
'index'}");
}
public void tearDown() throws Exception {