sylvain 2003/10/24 07:12:19
Modified: src/java/org/apache/cocoon/generation
JXTemplateGenerator.java
Log:
Add leniency support to XPath expressions
Revision Changes Path
1.16 +44 -12
cocoon-2.1/src/java/org/apache/cocoon/generation/JXTemplateGenerator.java
Index: JXTemplateGenerator.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/java/org/apache/cocoon/generation/JXTemplateGenerator.java,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -r1.15 -r1.16
--- JXTemplateGenerator.java 20 Oct 2003 10:13:42 -0000 1.15
+++ JXTemplateGenerator.java 24 Oct 2003 14:12:18 -0000 1.16
@@ -909,14 +909,22 @@
}
static private Object getValue(Expression expr, JexlContext jexlContext,
- JXPathContext jxpathContext)
+ JXPathContext jxpathContext, Boolean lenient)
throws Exception {
if (expr == null) return null;
Object compiled = expr.compiledExpression;
try {
if (compiled instanceof CompiledExpression) {
CompiledExpression e = (CompiledExpression)compiled;
- return e.getValue(jxpathContext);
+ boolean oldLenient = jxpathContext.isLenient();
+ if (lenient != null) {
+ jxpathContext.setLenient(lenient.booleanValue());
+ }
+ try {
+ return e.getValue(jxpathContext);
+ } finally {
+ jxpathContext.setLenient(oldLenient);
+ }
} else if (compiled instanceof
org.apache.commons.jexl.Expression) {
org.apache.commons.jexl.Expression e =
(org.apache.commons.jexl.Expression)compiled;
@@ -931,6 +939,10 @@
throw (Error)t;
}
}
+
+ static private Object getValue(Expression expr, JexlContext jexlContext,
JXPathContext jxpathContext) throws Exception {
+ return getValue(expr, jexlContext, jxpathContext, null);
+ }
static private int getIntValue(Expression expr, JexlContext jexlContext,
JXPathContext jxpathContext)
@@ -980,13 +992,19 @@
// Hack: try to prevent JXPath from converting result to a String
private Object getNode(Expression expr, JexlContext jexlContext,
- JXPathContext jxpathContext)
+ JXPathContext jxpathContext, Boolean lenient)
throws Exception {
try {
Object compiled = expr.compiledExpression;
if (compiled instanceof CompiledExpression) {
CompiledExpression e = (CompiledExpression)compiled;
- return e.getPointer(jxpathContext, expr.raw).getNode();
+ boolean oldLenient = jxpathContext.isLenient();
+ if (lenient != null)
jxpathContext.setLenient(lenient.booleanValue());
+ try {
+ return e.getPointer(jxpathContext, expr.raw).getNode();
+ } finally {
+ jxpathContext.setLenient(oldLenient);
+ }
} else if (compiled instanceof
org.apache.commons.jexl.Expression) {
org.apache.commons.jexl.Expression e =
(org.apache.commons.jexl.Expression)compiled;
@@ -1001,6 +1019,10 @@
throw (Error)t;
}
}
+
+ private Object getNode(Expression expr, JexlContext jexlContext,
JXPathContext jxpathContext) throws Exception {
+ return getNode(expr, jexlContext, jxpathContext, null);
+ }
static class Event {
final Locator location;
@@ -1470,19 +1492,21 @@
static class StartForEach extends StartInstruction {
StartForEach(StartElement raw,
Expression items, String var,
- Expression begin, Expression end, Expression step) {
+ Expression begin, Expression end, Expression step,
Boolean lenient) {
super(raw);
this.items = items;
this.var = var;
this.begin = begin;
this.end = end;
this.step = step;
+ this.lenient = lenient;
}
final Expression items;
final String var;
final Expression begin;
final Expression end;
final Expression step;
+ final Boolean lenient;
}
static class StartIf extends StartInstruction {
@@ -1518,11 +1542,13 @@
}
static class StartOut extends StartInstruction {
- StartOut(StartElement raw, Expression expr) {
+ StartOut(StartElement raw, Expression expr, Boolean lenient) {
super(raw);
this.compiledExpression = expr;
+ this.lenient = lenient;
}
final Expression compiledExpression;
+ final Boolean lenient;
}
static class StartImport extends StartInstruction {
@@ -2234,9 +2260,11 @@
Expression expr;
expr = compileExpr(items == null ? select : items,
null, locator);
+ String lenientValue = attrs.getValue("lenient");
+ Boolean lenient = (lenientValue == null) ? null :
Boolean.valueOf(lenientValue);
StartForEach startForEach =
new StartForEach(startElement, expr,
- var, begin, end, step);
+ var, begin, end, step,lenient);
newEvent = startForEach;
} else if (localName.equals(FORMAT_NUMBER)) {
Expression value =
@@ -2350,7 +2378,9 @@
Expression expr = compileExpr(value,
"out: \"value\": ",
locator);
- newEvent = new StartOut(startElement, expr);
+ String lenientValue = attrs.getValue("lenient");
+ Boolean lenient = lenientValue == null ? null:
Boolean.valueOf(lenientValue);
+ newEvent = new StartOut(startElement, expr, lenient);
} else if (localName.equals(OTHERWISE)) {
if (stack.size() == 0 ||
!(stack.peek() instanceof StartChoose)) {
@@ -2667,6 +2697,7 @@
jxpathContext = jxpathContextFactory.newContext(null, contextObject);
jxpathContext.setVariables(variables);
+
jxpathContext.setLenient(parameters.getParameterAsBoolean("lenient-xpath",
false));
globalJexlContext = new MyJexlContext();
globalJexlContext.setVars(map);
map = globalJexlContext.getVars();
@@ -2974,7 +3005,7 @@
StartIf startIf = (StartIf)ev;
Object val;
try {
- val = getValue(startIf.test, jexlContext, jxpathContext);
+ val = getValue(startIf.test, jexlContext, jxpathContext,
Boolean.TRUE);
} catch (Exception e) {
throw new SAXParseException(e.getMessage(),
ev.location,
@@ -3116,7 +3147,7 @@
Object val;
try {
val = getValue(startWhen.test, jexlContext,
- jxpathContext);
+ jxpathContext, Boolean.TRUE);
} catch (Exception e) {
throw new SAXParseException(e.getMessage(),
ev.location,
@@ -3447,7 +3478,8 @@
try {
val = getNode(startOut.compiledExpression,
jexlContext,
- jxpathContext);
+ jxpathContext,
+ startOut.lenient);
if (val instanceof Node) {
executeDOM(consumer,
jexlContext,