coliver 2003/04/12 16:35:30
Modified: src/scratchpad/src/org/apache/cocoon/transformation
JXPathTransformer.java JexlTransformer.java
Log:
added object model objects: request, response, session, context to JXPath and Jexl
contexts: so these are now consistent with FlowVelocityGenerator
Revision Changes Path
1.8 +88 -26
cocoon-2.1/src/scratchpad/src/org/apache/cocoon/transformation/JXPathTransformer.java
Index: JXPathTransformer.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/scratchpad/src/org/apache/cocoon/transformation/JXPathTransformer.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- JXPathTransformer.java 6 Apr 2003 17:14:57 -0000 1.7
+++ JXPathTransformer.java 12 Apr 2003 23:35:29 -0000 1.8
@@ -65,7 +65,10 @@
import org.apache.cocoon.components.flow.WebContinuation;
import org.apache.cocoon.components.source.SourceUtil;
import org.apache.cocoon.environment.Environment;
+import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.SourceResolver;
+import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.environment.Response;
import org.apache.cocoon.generation.Generator;
import org.apache.commons.jxpath.JXPathContext;
import org.apache.commons.jxpath.JXPathContextFactory;
@@ -86,7 +89,8 @@
* </p>
* <p>
* Provides a tag library and embedded XPath expression substitution
- * to access data sent by the Cocoon flow layer
+ * to access data sent by Cocoon flowscripts
+ *
* </p>
*
*
@@ -101,23 +105,26 @@
public static final String JXPATH_NAMESPACE_URI =
"http://cocoon.apache.org/transformation/jxpath/1.0";
- public static final String JXPATH_FOR_EACH = "for-each";
+ public static final String JXPATH_FOR_EACH = "for-each";
public static final String JXPATH_CHOOSE = "choose";
- public static final String JXPATH_WHEN = "when";
- public static final String JXPATH_OTHERWISE = "otherwise";
+ public static final String JXPATH_WHEN = "when";
+ public static final String JXPATH_OTHERWISE = "otherwise";
public static final String JXPATH_VALUEOF = "value-of";
public static final String JXPATH_VALUEOF_SELECT = "select";
public static final String JXPATH_CONTINUATION = "continuation";
public static final String JXPATH_CONTINUATION_SELECT = "select";
public static final String JXPATH_IF = "if";
- public static final String JXPATH_IF_TEST = "test";
- public static final String JXPATH_WHEN_TEST = "test";
+ public static final String JXPATH_IF_TEST = "test";
+ public static final String JXPATH_WHEN_TEST = "test";
// web contination
private WebContinuation kont;
+ // XPath variables
+ private MyVariables variables;
+
// TBD: Don't really need stacks for these in current implementation of for-each
- private Stack foreachStack = new Stack();
+ private Stack foreachStack;
// Stack of JXPathContext's
private Stack contextStack;
@@ -217,6 +224,13 @@
chooseStack = new Stack();
ifStack = new Stack();
inChoose = false;
+ variables = new MyVariables(bean,
+ kont,
+ ObjectModelHelper.getRequest(objectModel),
+ ObjectModelHelper.getResponse(objectModel),
+ ObjectModelHelper.getContext(objectModel),
+ parameters);
+
pushContext(bean);
}
@@ -429,6 +443,71 @@
return (JXPathContext)contextStack.peek();
}
+
+ static class MyVariables implements Variables {
+
+ static final String[] VARIABLES = new String[] {
+ "continuation",
+ "flowContext",
+ "request",
+ "response",
+ "context",
+ "session",
+ "parameters"
+ };
+
+ Object bean, kont, request, response,
+ session, context, parameters;
+
+ MyVariables(Object bean, WebContinuation kont,
+ Request request, Response response,
+ org.apache.cocoon.environment.Context context,
+ Parameters parameters) {
+ this.bean = bean;
+ this.kont = kont;
+ this.request = request;
+ this.session = request.getSession(false);
+ this.response = response;
+ this.context = context;
+ this.parameters = parameters;
+ }
+
+ public boolean isDeclaredVariable(String varName) {
+ for (int i = 0; i < VARIABLES.length; i++) {
+ if (varName.equals(VARIABLES[i])) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public Object getVariable(String varName) {
+ if (varName.equals("continuation")) {
+ return kont;
+ } else if (varName.equals("flowContext")) {
+ return bean;
+ } else if (varName.equals("request")) {
+ return request;
+ } else if (varName.equals("response")) {
+ return response;
+ } else if (varName.equals("session")) {
+ return session;
+ } else if (varName.equals("context")) {
+ return context;
+ } else if (varName.equals("parameters")) {
+ return parameters;
+ }
+ return null;
+ }
+
+ public void declareVariable(String varName, Object value) {
+ }
+
+ public void undeclareVariable(String varName) {
+ }
+ }
+
+
private void pushContext(Object contextObject) {
JXPathContext ctx =
jxpathContextFactory.newContext(null, contextObject);
@@ -441,25 +520,7 @@
//
// <form action="kont/{getContinuation($continuation, 1)/id}" ...
//
- ctx.setVariables(new Variables() {
-
- public boolean isDeclaredVariable(String varName) {
- return varName.equals("continuation");
- }
-
- public Object getVariable(String varName) {
- if (varName.equals("continuation")) {
- return kont;
- }
- return null;
- }
-
- public void declareVariable(String varName, Object value) {
- }
-
- public void undeclareVariable(String varName) {
- }
- });
+ ctx.setVariables(variables);
contextStack.push(ctx);
}
@@ -679,5 +740,6 @@
foreachStack = null;
chooseStack = null;
ifStack = null;
+ variables = null;
}
}
1.5 +114 -39
cocoon-2.1/src/scratchpad/src/org/apache/cocoon/transformation/JexlTransformer.java
Index: JexlTransformer.java
===================================================================
RCS file:
/home/cvs/cocoon-2.1/src/scratchpad/src/org/apache/cocoon/transformation/JexlTransformer.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- JexlTransformer.java 6 Apr 2003 17:14:57 -0000 1.4
+++ JexlTransformer.java 12 Apr 2003 23:35:29 -0000 1.5
@@ -71,6 +71,10 @@
import org.apache.cocoon.components.source.SourceUtil;
import org.apache.cocoon.environment.Environment;
import org.apache.cocoon.environment.SourceResolver;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.environment.Response;
+import org.apache.cocoon.environment.Session;
import org.apache.cocoon.generation.Generator;
import org.apache.commons.jexl.Expression;
import org.apache.commons.jexl.ExpressionFactory;
@@ -105,6 +109,7 @@
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.AttributesImpl;
+
/**
* Jexl Transformer.
*
@@ -443,15 +448,18 @@
// web contination
private WebContinuation kont;
- JexlContext jexlContext;
- Stack jxpathContextStack;
+ private JexlContext jexlContext;
+ private Stack jxpathContextStack;
+
+ private Iterator foreachIter;
+ private boolean foreachXPath;
+ private String foreachVar;
+ private int foreachBegin;
+ private int foreachEnd;
+ private int foreachStep;
- Iterator foreachIter;
- boolean foreachXPath;
- String foreachVar;
- int foreachBegin;
- int foreachEnd;
- int foreachStep;
+ // XPath variables
+ private MyVariables variables;
//
// Contains a stack of Boolean values:
@@ -475,12 +483,12 @@
// Each time we enter an <if> we push the test condition on this stack and
// pop it when we reach </if>, where it is checked to see if ignoreEventsCount
// should be updated
- Stack ifStack;
+ private Stack ifStack;
// Run as a generator for debugging: to get line numbers in error messages
private Source inputSource;
- Locator locator = null;
+ private Locator locator = null;
public void setDocumentLocator(Locator loc) {
this.locator = loc;
@@ -542,20 +550,23 @@
throw SourceUtil.handle("Error during resolving of '" + src + "'.",
se);
}
}
+ // Fix me: when we decide the proper way to pass bean-dict and kont
Object bean = ((Environment)resolver).getAttribute("bean-dict");
kont = (WebContinuation)((Environment)resolver).getAttribute("kont");
chooseStack = new Stack();
ifStack = new Stack();
jxpathContextStack = new Stack();
jexlContext = JexlHelper.createContext();
- setContexts(bean);
- getJexlContext().getVars().put("this", bean);
- getJexlContext().getVars().put("continuation", kont);
+ setContexts(bean, kont,
+ ObjectModelHelper.getRequest(objectModel),
+ ObjectModelHelper.getResponse(objectModel),
+ ObjectModelHelper.getContext(objectModel),
+ parameters);
}
/**
- * Evaluate a Jexl expr contained in ${} but don't do substitution:
- * just return its value
+ * Evaluate a single Jexl expr (contained in ${}) or XPath expression
+ * (contained in {}) but don't do substitution: just return its value
*/
private Object eval(String inStr) throws SAXException {
@@ -633,6 +644,7 @@
str = String.valueOf(getValue(str, xpath, false));
out.write(str);
inExpr = false;
+ xpath = false;
} else if (c == '\\') {
ch = in.read();
if (ch == -1) {
@@ -675,8 +687,7 @@
}
}
} catch (IOException e) {
- throw new CascadingRuntimeException(e.getMessage(),
- e);
+ throw new CascadingRuntimeException(e.getMessage(), e);
}
}
@@ -699,6 +710,7 @@
}
super.startElement(uri, name, raw, attr);
}
+
/**
* Entry method for all elements in our namespace
*
@@ -791,29 +803,74 @@
private JXPathContext getJXPathContext() {
return (JXPathContext)jxpathContextStack.peek();
}
+
+ static class MyVariables implements Variables {
+
+ static final String[] VARIABLES = new String[] {
+ "continuation",
+ "flowContext",
+ "request",
+ "response",
+ "context",
+ "session",
+ "parameters"
+ };
+
+ Object bean, kont, request, response,
+ session, context, parameters;
+
+ MyVariables(Object bean, WebContinuation kont,
+ Request request, Response response,
+ org.apache.cocoon.environment.Context context,
+ Parameters parameters) {
+ this.bean = bean;
+ this.kont = kont;
+ this.request = request;
+ this.session = request.getSession(false);
+ this.response = response;
+ this.context = context;
+ this.parameters = parameters;
+ }
+
+ public boolean isDeclaredVariable(String varName) {
+ for (int i = 0; i < VARIABLES.length; i++) {
+ if (varName.equals(VARIABLES[i])) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public Object getVariable(String varName) {
+ if (varName.equals("continuation")) {
+ return kont;
+ } else if (varName.equals("flowContext")) {
+ return bean;
+ } else if (varName.equals("request")) {
+ return request;
+ } else if (varName.equals("response")) {
+ return response;
+ } else if (varName.equals("session")) {
+ return session;
+ } else if (varName.equals("context")) {
+ return context;
+ } else if (varName.equals("parameters")) {
+ return parameters;
+ }
+ return null;
+ }
+
+ public void declareVariable(String varName, Object value) {
+ }
+
+ public void undeclareVariable(String varName) {
+ }
+ }
private void pushJXPathContext(Object contextObject) {
JXPathContext jxpathContext =
jxpathContextFactory.newContext(null, contextObject);
- jxpathContext.setVariables(new Variables() {
-
- public boolean isDeclaredVariable(String varName) {
- return varName.equals("continuation");
- }
-
- public Object getVariable(String varName) {
- if (varName.equals("continuation")) {
- return kont;
- }
- return null;
- }
-
- public void declareVariable(String varName, Object value) {
- }
-
- public void undeclareVariable(String varName) {
- }
- });
+ jxpathContext.setVariables(variables);
jxpathContextStack.push(jxpathContext);
}
@@ -821,8 +878,20 @@
jxpathContextStack.pop();
}
-
- private void setContexts(Object contextObject) {
+ private void setContexts(Object contextObject,
+ WebContinuation kont,
+ Request request,
+ Response response,
+ org.apache.cocoon.environment.Context app,
+ Parameters parameters) {
+ if (variables == null) {
+ variables = new MyVariables(contextObject,
+ kont,
+ request,
+ response,
+ app,
+ parameters);
+ }
Map map;
if (contextObject instanceof Map) {
map = (Map)contextObject;
@@ -864,6 +933,12 @@
}
pushJXPathContext(contextObject);
jexlContext.setVars(map);
+ map = jexlContext.getVars();
+ map.put("flowContext", contextObject);
+ map.put("request", request);
+ map.put("response", response);
+ map.put("context", app);
+ map.put("session", request.getSession(false));
}
/**