Author: mrdon
Date: Sun Apr 10 19:50:40 2005
New Revision: 160820
URL: http://svn.apache.org/viewcvs?view=rev&rev=160820
Log:
* Adding variable registrars to allow code that uses flow to register
either static or call-specific variables. Default use is to register
a Struts object as 'struts'
* Renamed JSContext to JSFlow, so now the main variable in the flow
will be 'flow' instead of the confusing 'context'.
* Changed the Struts helper methods into Struts object described above
Added:
struts/flow/trunk/src/java/org/apache/struts/flow/Struts.java (with props)
struts/flow/trunk/src/java/org/apache/struts/flow/core/DefaultCallVariableRegistrar.java
(with props)
struts/flow/trunk/src/java/org/apache/struts/flow/core/DefaultStaticVariableRegistrar.java
(with props)
struts/flow/trunk/src/java/org/apache/struts/flow/core/JSFlow.java
- copied, changed from r160805,
struts/flow/trunk/src/java/org/apache/struts/flow/core/JSContext.java
struts/flow/trunk/src/java/org/apache/struts/flow/core/VariableRegistrar.java
(with props)
Removed:
struts/flow/trunk/src/java/org/apache/struts/flow/core/JSContext.java
struts/flow/trunk/src/java/struts.js
Modified:
struts/flow/trunk/src/examples/WEB-INF/guess/numberguess.js
struts/flow/trunk/src/examples/WEB-INF/remote/numberguess.js
struts/flow/trunk/src/examples/WEB-INF/templates/numberguess.js
struts/flow/trunk/src/examples/WEB-INF/wizard/wizard-flow.js
struts/flow/trunk/src/examples/WEB-INF/wizard/wizard.js
struts/flow/trunk/src/java/org/apache/struts/flow/FlowAction.java
struts/flow/trunk/src/java/org/apache/struts/flow/FlowPlugIn.java
struts/flow/trunk/src/java/org/apache/struts/flow/core/JSWebContinuation.java
struts/flow/trunk/src/java/org/apache/struts/flow/core/JavaScriptInterpreter.java
struts/flow/trunk/src/java/system.js
Modified: struts/flow/trunk/src/examples/WEB-INF/guess/numberguess.js
URL:
http://svn.apache.org/viewcvs/struts/flow/trunk/src/examples/WEB-INF/guess/numberguess.js?view=diff&r1=160819&r2=160820
==============================================================================
--- struts/flow/trunk/src/examples/WEB-INF/guess/numberguess.js (original)
+++ struts/flow/trunk/src/examples/WEB-INF/guess/numberguess.js Sun Apr 10
19:50:40 2005
@@ -13,7 +13,7 @@
"guesses" : guesses} );
// process user's guess
- var guess = parseInt( getRequestParams().guess );
+ var guess = parseInt( struts.param.guess );
guesses++;
if (guess) {
if (guess > random) {
Modified: struts/flow/trunk/src/examples/WEB-INF/remote/numberguess.js
URL:
http://svn.apache.org/viewcvs/struts/flow/trunk/src/examples/WEB-INF/remote/numberguess.js?view=diff&r1=160819&r2=160820
==============================================================================
--- struts/flow/trunk/src/examples/WEB-INF/remote/numberguess.js (original)
+++ struts/flow/trunk/src/examples/WEB-INF/remote/numberguess.js Sun Apr 10
19:50:40 2005
@@ -16,9 +16,9 @@
"guesses" : guesses},
["cheat"]);
- print("processing a user guess "+getRequestParams().guess);
+ print("processing a user guess "+struts.param.guess);
// process user's guess
- var guess = parseInt( getRequestParams().guess );
+ var guess = parseInt( struts.param.guess );
guesses++;
if (guess) {
if (guess > random) {
Modified: struts/flow/trunk/src/examples/WEB-INF/templates/numberguess.js
URL:
http://svn.apache.org/viewcvs/struts/flow/trunk/src/examples/WEB-INF/templates/numberguess.js?view=diff&r1=160819&r2=160820
==============================================================================
--- struts/flow/trunk/src/examples/WEB-INF/templates/numberguess.js (original)
+++ struts/flow/trunk/src/examples/WEB-INF/templates/numberguess.js Sun Apr 10
19:50:40 2005
@@ -1,4 +1,4 @@
-context.load("/templates/template.js");
+flow.load("/templates/template.js");
var random;
var guesses;
@@ -19,7 +19,7 @@
["cheat"]);
// process user's guess
- var guess = parseInt( getRequestParams().guess );
+ var guess = parseInt( struts.param.guess );
guesses++;
if (guess) {
if (guess > random) {
@@ -58,11 +58,11 @@
// Use default ttl value from continuation manager
var timeToLive = 0;
- var kont = new WebContinuation(context, k, lastContinuation,
timeToLive);
+ var kont = new WebContinuation(flow, k, lastContinuation, timeToLive);
bizdata.contid = kont.id;
- res = context.chainContext.response;
- stream =
context.chainContext.context.getResourceAsStream("/WEB-INF/templates/"+page+".jt");
+ res = flow.context.response;
+ stream =
struts.servletContext.getResourceAsStream("/WEB-INF/templates/"+page+".jt");
if (stream != null) {
text = new String(stream.getText());
html = text.process(bizdata);
Modified: struts/flow/trunk/src/examples/WEB-INF/wizard/wizard-flow.js
URL:
http://svn.apache.org/viewcvs/struts/flow/trunk/src/examples/WEB-INF/wizard/wizard-flow.js?view=diff&r1=160819&r2=160820
==============================================================================
--- struts/flow/trunk/src/examples/WEB-INF/wizard/wizard-flow.js (original)
+++ struts/flow/trunk/src/examples/WEB-INF/wizard/wizard-flow.js Sun Apr 10
19:50:40 2005
@@ -1,5 +1,5 @@
importPackage(Packages.java.util);
-context.load("/WEB-INF/wizard/wizard.js");
+flow.load("/WEB-INF/wizard/wizard.js");
function main() {
var model = new HashMap();
@@ -20,13 +20,13 @@
}
function populate() {
- m = context.chainContext.paramValues;
+ m = struts.paramValues;
for (i = m.keySet().iterator(); i.hasNext(); ) {
key = i.next();
this.model.put(key, m.get(key)[0]);
}
// Bug in commons-chain prevents this
- //this.model.putAll(context.chainContext.getParamValues());
+ //this.model.putAll(struts.paramValues);
}
function validate() {
Modified: struts/flow/trunk/src/examples/WEB-INF/wizard/wizard.js
URL:
http://svn.apache.org/viewcvs/struts/flow/trunk/src/examples/WEB-INF/wizard/wizard.js?view=diff&r1=160819&r2=160820
==============================================================================
--- struts/flow/trunk/src/examples/WEB-INF/wizard/wizard.js (original)
+++ struts/flow/trunk/src/examples/WEB-INF/wizard/wizard.js Sun Apr 10 19:50:40
2005
@@ -70,10 +70,10 @@
*/
Wizard.prototype.sendFormAndWait = function(name, lastWebCont, bizdata) {
var k = new Continuation();
- var wk = new WebContinuation(context, k, lastWebCont, this.timeToLive);
- context.put(Constants.FORWARD_NAME_KEY, name);
- context.put(Constants.CONTINUATION_ID_KEY, wk.id);
- context.put(Constants.BIZ_DATA_KEY, bizdata);
+ var wk = new WebContinuation(flow, k, lastWebCont, this.timeToLive);
+ flow.put(Packages.org.apache.struts.flow.Constants.FORWARD_NAME_KEY, name);
+ flow.put(Packages.org.apache.struts.flow.Constants.CONTINUATION_ID_KEY,
wk.id);
+ flow.put(Packages.org.apache.struts.flow.Constants.BIZ_DATA_KEY, bizdata);
suicide();
}
@@ -135,7 +135,7 @@
// Determine if next button is pressed and should stop showing
if ((doValidate && !keepShowing) || !doValidate) {
keepShowing = true;
- params = getRequestParams();
+ params = struts.param;
for (id in exitIds) {
if (params[exitIds[id]] != null || params[exitIds[id]+'.x'] !=
null) {
exitId = exitIds[id];
@@ -162,8 +162,8 @@
// This can be overridden by declaring a "prevId" variable outside the
function
var prevId = (this.prevId != null ? this.prevId : "prev");
- log.debug("Previous Id:"+context.chainContext.param.get(prevId));
- if (context.chainContext.param.get(prevId) != null) {
+ log.debug("Previous Id:"+struts.param.get(prevId));
+ if (struts.param.get(prevId) != null) {
log.debug("going back");
k = kont.webContinuation;
for (x=0; x<3; x++) {
Modified: struts/flow/trunk/src/java/org/apache/struts/flow/FlowAction.java
URL:
http://svn.apache.org/viewcvs/struts/flow/trunk/src/java/org/apache/struts/flow/FlowAction.java?view=diff&r1=160819&r2=160820
==============================================================================
--- struts/flow/trunk/src/java/org/apache/struts/flow/FlowAction.java (original)
+++ struts/flow/trunk/src/java/org/apache/struts/flow/FlowAction.java Sun Apr
10 19:50:40 2005
@@ -35,7 +35,7 @@
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessages;
-import org.apache.struts.flow.core.JSContext;
+import org.apache.struts.flow.core.JSFlow;
import org.apache.struts.flow.core.JavaScriptInterpreter;
import org.apache.struts.flow.json.JSONArray;
import org.apache.struts.flow.json.JSONSerializer;
@@ -146,12 +146,12 @@
interp.callFunction(func, args, context);
// retrieve page, continuation ID, and attributes from chain
context
- String page = (String)
JSContext.jsobjectToObject(context.get(Constants.FORWARD_NAME_KEY));
+ String page = (String)
JSFlow.jsobjectToObject(context.get(Constants.FORWARD_NAME_KEY));
contid = (String) context.get(Constants.CONTINUATION_ID_KEY);
Scriptable bizdata = (Scriptable)
context.get(Constants.BIZ_DATA_KEY);
Map atts = null;
if (bizdata != null) {
- atts = JSContext.jsobjectToMap(bizdata);
+ atts = JSFlow.jsobjectToMap(bizdata);
}
return dispatchToPage(request, response, mapping, page,
contid, atts);
}
@@ -189,7 +189,7 @@
Scriptable bizdata = (Scriptable)
context.get(Constants.BIZ_DATA_KEY);
Map atts = null;
if (bizdata != null) {
- atts = JSContext.jsobjectToMap(bizdata);
+ atts = JSFlow.jsobjectToMap(bizdata);
}
// if a flowcall, return pure json
@@ -234,7 +234,7 @@
Iterator attkeys = atts.keySet().iterator();
while (attkeys.hasNext()) {
String attkey = (String) attkeys.next();
- request.setAttribute(attkey,
JSContext.jsobjectToObject(atts.get(attkey)));
+ request.setAttribute(attkey,
JSFlow.jsobjectToObject(atts.get(attkey)));
}
}
Modified: struts/flow/trunk/src/java/org/apache/struts/flow/FlowPlugIn.java
URL:
http://svn.apache.org/viewcvs/struts/flow/trunk/src/java/org/apache/struts/flow/FlowPlugIn.java?view=diff&r1=160819&r2=160820
==============================================================================
--- struts/flow/trunk/src/java/org/apache/struts/flow/FlowPlugIn.java (original)
+++ struts/flow/trunk/src/java/org/apache/struts/flow/FlowPlugIn.java Sun Apr
10 19:50:40 2005
@@ -28,6 +28,7 @@
import org.apache.struts.config.ModuleConfig;
import org.apache.struts.flow.core.Factory;
import org.apache.struts.flow.core.JavaScriptInterpreter;
+import org.apache.struts.flow.core.DefaultCallVariableRegistrar;
import org.apache.struts.flow.sugar.SugarWrapFactory;
/**
@@ -228,7 +229,7 @@
interp.setWrapFactory(new SugarWrapFactory());
interp.initialize();
interp.register("/system.js");
- interp.register("/struts.js");
+ interp.addVariableRegistrar(new
DefaultCallVariableRegistrar(Struts.class, "struts"));
return interp;
}
Added: struts/flow/trunk/src/java/org/apache/struts/flow/Struts.java
URL:
http://svn.apache.org/viewcvs/struts/flow/trunk/src/java/org/apache/struts/flow/Struts.java?view=auto&rev=160820
==============================================================================
--- struts/flow/trunk/src/java/org/apache/struts/flow/Struts.java (added)
+++ struts/flow/trunk/src/java/org/apache/struts/flow/Struts.java Sun Apr 10
19:50:40 2005
@@ -0,0 +1,118 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.struts.flow;
+
+import org.apache.struts.flow.core.*;
+import org.apache.struts.action.ActionMapping;
+import org.apache.struts.action.ActionErrors;
+import org.apache.struts.action.ActionMessages;
+import javax.servlet.*;
+import org.apache.commons.chain.Context;
+import org.apache.commons.chain.web.servlet.ServletWebContext;
+import org.apache.struts.util.MessageResources;
+
+import java.util.Map;
+
+/**
+ * Access to Struts and Servlet resources
+ */
+public class Struts {
+
+ protected ServletWebContext ctx = null;
+ protected static final Logger logger = Factory.getLogger();
+
+ public Struts() {
+ throw new IllegalStateException("Cannot create new Struts object in a
flow script");
+ }
+
+
+ /** Constructor for the JSLog object */
+ public Struts(Context ctx) {
+ if (ctx instanceof ServletWebContext) {
+ this.ctx = (ServletWebContext)ctx;
+ } else {
+ logger.warn("Unknown context instance");
+ }
+ }
+
+ public Map getParam() {
+ return ctx.getParam();
+ }
+
+ public Map getParamValues() {
+ return ctx.getParamValues();
+ }
+
+ public Map getRequestScope() {
+ return ctx.getRequestScope();
+ }
+
+ public Map getSessionScope() {
+ return ctx.getSessionScope();
+ }
+
+ public Map getApplicationScope() {
+ return ctx.getApplicationScope();
+ }
+
+ public ServletRequest getRequest() {
+ return ctx.getRequest();
+ }
+
+ public ServletContext getServletContext() {
+ return ctx.getContext();
+ }
+
+ public String getMessage(String key) {
+ MessageResources res =
(MessageResources)ctx.get(Constants.MESSAGE_RESOURCES_KEY);
+ return res.getMessage(key);
+ }
+
+ public ActionMapping getMapping() {
+ return (ActionMapping)ctx.get(Constants.ACTION_CONFIG_KEY);
+ }
+
+ public boolean isCancelled() {
+ FlowAction action = (FlowAction)ctx.get(Constants.ACTION_KEY);
+ return action.isCancelled(ctx.getRequest());
+ }
+
+ public boolean isTokenValid() {
+ FlowAction action = (FlowAction)ctx.get(Constants.ACTION_KEY);
+ return action.isTokenValid(ctx.getRequest());
+ }
+
+ public void resetToken() {
+ FlowAction action = (FlowAction)ctx.get(Constants.ACTION_KEY);
+ action.resetToken(ctx.getRequest());
+ }
+
+ public void saveErrors(ActionErrors errors) {
+ FlowAction action = (FlowAction)ctx.get(Constants.ACTION_KEY);
+ action.saveErrors(ctx.getRequest(), errors);
+ }
+
+ public void saveMessages(ActionMessages msgs) {
+ FlowAction action = (FlowAction)ctx.get(Constants.ACTION_KEY);
+ action.saveMessages(ctx.getRequest(), msgs);
+ }
+
+ public void saveToken() {
+ FlowAction action = (FlowAction)ctx.get(Constants.ACTION_KEY);
+ action.saveToken(ctx.getRequest());
+ }
+}
+
Propchange: struts/flow/trunk/src/java/org/apache/struts/flow/Struts.java
------------------------------------------------------------------------------
svn:executable = *
Added:
struts/flow/trunk/src/java/org/apache/struts/flow/core/DefaultCallVariableRegistrar.java
URL:
http://svn.apache.org/viewcvs/struts/flow/trunk/src/java/org/apache/struts/flow/core/DefaultCallVariableRegistrar.java?view=auto&rev=160820
==============================================================================
---
struts/flow/trunk/src/java/org/apache/struts/flow/core/DefaultCallVariableRegistrar.java
(added)
+++
struts/flow/trunk/src/java/org/apache/struts/flow/core/DefaultCallVariableRegistrar.java
Sun Apr 10 19:50:40 2005
@@ -0,0 +1,104 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.struts.flow.core;
+
+import org.mozilla.javascript.Scriptable;
+import org.apache.commons.chain.Context;
+import java.lang.reflect.Constructor;
+
+/**
+ * Defines a variable registrar used to define a call-specific variable in the
+ * global scope. Static variables are defined once per global scope, while
+ * call-specific variables can define instances of themselves for every script
+ * call.
+ */
+public class DefaultCallVariableRegistrar implements VariableRegistrar {
+
+ private Class variableClass;
+ private String variableName;
+
+ public DefaultCallVariableRegistrar(Class variableClass, String
variableName) {
+ this.variableName = variableName;
+ this.variableClass = variableClass;
+ }
+
+ /**
+ * Gets the Class object for the variable
+ *
+ [EMAIL PROTECTED] The classInstance value
+ */
+ public Class getClassInstance() {
+ return variableClass;
+ }
+
+ /**
+ * Gets the name of the variable class
+ *
+ [EMAIL PROTECTED] The className value
+ */
+ public String getClassName() {
+ ;
+ return variableClass.getName();
+ }
+
+ /**
+ * Gets an instance of the variable. First tries to call constructor that
+ * takes a single argument of the Context. If not found, it calls the
empty
+ * constructor.
+ *
+ [EMAIL PROTECTED] scope The scope the variable will be placed in
+ [EMAIL PROTECTED] ctx The commons chain context for the call, null if
defining a
+ * static variable
+ [EMAIL PROTECTED] The instance value
+ */
+ public Object getInstance(Scriptable scope, Context ctx) {
+ try {
+ Constructor c = null;
+ try {
+ c = variableClass.getConstructor(new Class[]{Context.class});
+ } catch (NoSuchMethodException ex) {
+ // ignored
+ }
+ if (c != null) {
+ return c.newInstance(new Object[]{ctx});
+ } else {
+ return variableClass.newInstance();
+ }
+ } catch (Exception ex) {
+ Factory.getLogger().error(ex);
+ return null;
+ }
+ }
+
+ /**
+ * Gets the variable name
+ *
+ [EMAIL PROTECTED] The name value
+ */
+ public String getName() {
+ return variableName;
+ }
+
+ /**
+ * Returns whether this variable is call-specific or static
+ *
+ [EMAIL PROTECTED] The callSpecific value
+ */
+ public boolean isCallSpecific() {
+ return true;
+ }
+}
+
Propchange:
struts/flow/trunk/src/java/org/apache/struts/flow/core/DefaultCallVariableRegistrar.java
------------------------------------------------------------------------------
svn:executable = *
Added:
struts/flow/trunk/src/java/org/apache/struts/flow/core/DefaultStaticVariableRegistrar.java
URL:
http://svn.apache.org/viewcvs/struts/flow/trunk/src/java/org/apache/struts/flow/core/DefaultStaticVariableRegistrar.java?view=auto&rev=160820
==============================================================================
---
struts/flow/trunk/src/java/org/apache/struts/flow/core/DefaultStaticVariableRegistrar.java
(added)
+++
struts/flow/trunk/src/java/org/apache/struts/flow/core/DefaultStaticVariableRegistrar.java
Sun Apr 10 19:50:40 2005
@@ -0,0 +1,86 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.struts.flow.core;
+
+import org.mozilla.javascript.Scriptable;
+import org.apache.commons.chain.Context;
+
+/**
+ * Defines a variable registrar used to define a static variable in the global
+ * scope. Static variables are defined once per global scope, while
+ * call-specific variables can define instances of themselves for every script
+ * call.
+ */
+public class DefaultStaticVariableRegistrar implements VariableRegistrar {
+
+ private String variableName;
+ private Object variable;
+
+ public DefaultStaticVariableRegistrar(String variableName, Object var) {
+ this.variableName = variableName;
+ this.variable = var;
+ }
+
+ /**
+ * Gets the Class object for the variable
+ *
+ [EMAIL PROTECTED] The classInstance value
+ */
+ public Class getClassInstance() {
+ return variable.getClass();
+ }
+
+ /**
+ * Gets the name of the variable class
+ *
+ [EMAIL PROTECTED] The className value
+ */
+ public String getClassName() {
+ ;
+ return variable.getClass().getName();
+ }
+
+ /**
+ * Gets an instance of the variable
+ *
+ [EMAIL PROTECTED] scope The scope the variable will be placed in
+ [EMAIL PROTECTED] ctx The commons chain context for the call, null if
defining a
+ * static variable
+ [EMAIL PROTECTED] The instance value
+ */
+ public Object getInstance(Scriptable scope, Context ctx) {
+ return variable;
+ }
+
+ /**
+ * Gets the variable name
+ *
+ [EMAIL PROTECTED] The name value
+ */
+ public String getName() {
+ return variableName;
+ }
+
+ /**
+ * Returns whether this variable is call-specific or static
+ *
+ [EMAIL PROTECTED] The callSpecific value
+ */
+ public boolean isCallSpecific() {
+ return false;
+ }
+}
+
Propchange:
struts/flow/trunk/src/java/org/apache/struts/flow/core/DefaultStaticVariableRegistrar.java
------------------------------------------------------------------------------
svn:executable = *
Copied: struts/flow/trunk/src/java/org/apache/struts/flow/core/JSFlow.java
(from r160805,
struts/flow/trunk/src/java/org/apache/struts/flow/core/JSContext.java)
URL:
http://svn.apache.org/viewcvs/struts/flow/trunk/src/java/org/apache/struts/flow/core/JSFlow.java?view=diff&rev=160820&p1=struts/flow/trunk/src/java/org/apache/struts/flow/core/JSContext.java&r1=160805&p2=struts/flow/trunk/src/java/org/apache/struts/flow/core/JSFlow.java&r2=160820
==============================================================================
--- struts/flow/trunk/src/java/org/apache/struts/flow/core/JSContext.java
(original)
+++ struts/flow/trunk/src/java/org/apache/struts/flow/core/JSFlow.java Sun Apr
10 19:50:40 2005
@@ -44,9 +44,9 @@
[EMAIL PROTECTED] <a href="mailto:[EMAIL PROTECTED]">Ovidiu Predescu</a>
[EMAIL PROTECTED] <a href="[EMAIL PROTECTED]">Dave Johnson</a>
[EMAIL PROTECTED] March 16, 2002
- [EMAIL PROTECTED] CVS $Id: JSContext.java,v 1.3 2004/11/05 05:12:10 mrdon
Exp $
+ [EMAIL PROTECTED] CVS $Id: JSFlow.java,v 1.3 2004/11/05 05:12:10 mrdon Exp
$
*/
-public class JSContext extends ScriptableObject {
+public class JSFlow extends ScriptableObject {
/** The interpreter */
private JavaScriptInterpreter interpreter;
/** The parameters passed by the Flow container */
@@ -58,8 +58,8 @@
private ThreadLocal contextTls = new ThreadLocal();
- /** Constructor for the JSContext object */
- public JSContext() {
+ /** Constructor for the JSFlow object */
+ public JSFlow() {
super();
}
@@ -70,7 +70,7 @@
[EMAIL PROTECTED] The className value
*/
public String getClassName() {
- return "context";
+ return "flow";
}
@@ -149,7 +149,7 @@
public Object jsFunction_resolveToPath(String filename) throws
JavaScriptException {
try {
- return interpreter.calculatePath(jsGet_chainContext(), filename);
+ return interpreter.calculatePath(jsGet_context(), filename);
} catch (JavaScriptException e) {
throw e;
} catch (Exception e) {
@@ -253,7 +253,7 @@
*
[EMAIL PROTECTED] The chain context
*/
- public org.apache.commons.chain.Context jsGet_chainContext() {
+ public org.apache.commons.chain.Context jsGet_context() {
return (org.apache.commons.chain.Context) contextTls.get();
}
Modified:
struts/flow/trunk/src/java/org/apache/struts/flow/core/JSWebContinuation.java
URL:
http://svn.apache.org/viewcvs/struts/flow/trunk/src/java/org/apache/struts/flow/core/JSWebContinuation.java?view=diff&r1=160819&r2=160820
==============================================================================
---
struts/flow/trunk/src/java/org/apache/struts/flow/core/JSWebContinuation.java
(original)
+++
struts/flow/trunk/src/java/org/apache/struts/flow/core/JSWebContinuation.java
Sun Apr 10 19:50:40 2005
@@ -32,7 +32,7 @@
public class JSWebContinuation extends ScriptableObject {
private WebContinuation wk;
private ContinuationsManager continuationsMgr;
- private JSContext ctx = null;
+ private JSFlow ctx = null;
/** Constructor for the JSWebContinuation object */
@@ -61,7 +61,7 @@
/**
* Creates the JavaScript web continuation
- [EMAIL PROTECTED] args Arguments: JSContext context, Object
continuation,
+ [EMAIL PROTECTED] args Arguments: JSFlow context, Object
continuation,
* JSWebContinuation parent, Number timeToLive
[EMAIL PROTECTED] cx The script context
[EMAIL PROTECTED] ctorObj The function
@@ -74,7 +74,7 @@
boolean inNewExpr)
throws Exception {
- JSContext ctx = (JSContext) args[0];
+ JSFlow ctx = (JSFlow) args[0];
ContinuationsManager contMgr = Factory.getContinuationsManager();
Object kont = args[1];
@@ -149,7 +149,7 @@
*
[EMAIL PROTECTED] The context value
*/
- public JSContext getContext() {
+ public JSFlow getContext() {
return ctx;
}
Modified:
struts/flow/trunk/src/java/org/apache/struts/flow/core/JavaScriptInterpreter.java
URL:
http://svn.apache.org/viewcvs/struts/flow/trunk/src/java/org/apache/struts/flow/core/JavaScriptInterpreter.java?view=diff&r1=160819&r2=160820
==============================================================================
---
struts/flow/trunk/src/java/org/apache/struts/flow/core/JavaScriptInterpreter.java
(original)
+++
struts/flow/trunk/src/java/org/apache/struts/flow/core/JavaScriptInterpreter.java
Sun Apr 10 19:50:40 2005
@@ -74,6 +74,8 @@
/** Shared global scope for scripts and other immutable objects */
private JSGlobal scope;
+ private List registrars = new ArrayList();
+
/**
* List of <code>String</code> objects that represent files to be read in
* by the JavaScript interpreter.
@@ -174,6 +176,24 @@
this.wrapFactory = wf;
}
+ /**
+ * Adds a class that will register a global variable
+ *
+ * @param reg The variable registrar
+ */
+ public void addVariableRegistrar(VariableRegistrar reg) {
+ registrars.add(reg);
+ }
+
+ /**
+ * Removes a class that will register a global variable
+ *
+ * @param reg The variable registrar
+ */
+ public void removeVariableRegistrar(VariableRegistrar reg) {
+ registrars.remove(reg);
+ }
+
/**
* Sets the interval between when the script should be looked at to see if
@@ -236,15 +256,20 @@
[EMAIL PROTECTED] context The context
[EMAIL PROTECTED] scope The scope to initialize
[EMAIL PROTECTED] IllegalAccessException If anything goes wrong
- [EMAIL PROTECTED] PropertyException If anything goes wrong
[EMAIL PROTECTED] InstantiationException If anything goes wrong
[EMAIL PROTECTED] InvocationTargetException If anything goes wrong
- [EMAIL PROTECTED] NotAFunctionException If anything goes wrong
- [EMAIL PROTECTED] ClassDefinitionException If anything goes wrong
[EMAIL PROTECTED] JavaScriptException If anything goes wrong
*/
protected void initScope(Context context, JSGlobal scope) throws
IllegalAccessException,
InstantiationException, InvocationTargetException,
JavaScriptException {
+
+ VariableRegistrar reg;
+ List lst;
+ for (Iterator i = registrars.iterator(); i.hasNext(); ) {
+ reg = (VariableRegistrar) i.next();
+ ScriptableObject.defineClass(scope, reg.getClassInstance());
+ }
+
// Access to the log
ScriptableObject.defineClass(scope, JSLog.class);
@@ -252,7 +277,7 @@
ScriptableObject.defineClass(scope, JSWebContinuation.class);
// Wrapper for commons-chain context
- ScriptableObject.defineClass(scope, JSContext.class);
+ ScriptableObject.defineClass(scope, JSFlow.class);
// Define some functions on the top level scope
String[] names = {"print"};
@@ -268,6 +293,16 @@
Scriptable log = context.newObject(scope, "Log", args);
((JSLog) log).enableLogging(getLogger());
scope.put("log", scope, log);
+
+ for (Iterator i = registrars.iterator(); i.hasNext(); ) {
+ reg = (VariableRegistrar) i.next();
+ if (!reg.isCallSpecific()) {
+ Scriptable var = context.newObject(scope, reg.getClassName(),
args);
+ scope.put(reg.getName(), scope, reg.getInstance(scope, null));
+ }
+ }
+
+
}
@@ -450,10 +485,10 @@
context.setCompileFunctionsWithDynamicScope(true);
// Obtain the JS continuation object from it, and setup the
- // JSContext object associated in the dynamic scope of the saved
+ // JSFlow object associated in the dynamic scope of the saved
// continuation with the environment and context objects.
JSWebContinuation jswk = (JSWebContinuation) wk.getUserObject();
- JSContext ctx = jswk.getContext();
+ JSFlow ctx = jswk.getContext();
final Scriptable kScope = ctx.getParentScope(chainCtx);
if (enableDebugger) {
getDebugger().setVisible(true);
@@ -633,12 +668,27 @@
// Put in the thread scope the context object, which gives access
// to the interpreter object and the chain context
Object args[] = {};
- JSContext ctx = (JSContext) context.newObject(
- thrScope, "context", args);
+ JSFlow ctx = (JSFlow) context.newObject(
+ thrScope, "flow", args);
ctx.setInterpreter(this);
ctx.setContext(chainCtx);
ctx.setParentScope(thrScope);
- thrScope.put("context", thrScope, ctx);
+ thrScope.put("flow", thrScope, ctx);
+
+ VariableRegistrar reg;
+ for (Iterator i = registrars.iterator(); i.hasNext(); ) {
+ reg = (VariableRegistrar) i.next();
+ if (reg.isCallSpecific()) {
+ WrapFactory factory = context.getWrapFactory();
+ Object o = reg.getInstance(scope, chainCtx);
+ if (o instanceof Scriptable) {
+ scope.put(reg.getName(), thrScope, (Scriptable)o);
+ } else {
+ Scriptable var = factory.wrapAsJavaObject(context,
thrScope, o, reg.getClassInstance());
+ scope.put(reg.getName(), thrScope, var);
+ }
+ }
+ }
}
Added:
struts/flow/trunk/src/java/org/apache/struts/flow/core/VariableRegistrar.java
URL:
http://svn.apache.org/viewcvs/struts/flow/trunk/src/java/org/apache/struts/flow/core/VariableRegistrar.java?view=auto&rev=160820
==============================================================================
---
struts/flow/trunk/src/java/org/apache/struts/flow/core/VariableRegistrar.java
(added)
+++
struts/flow/trunk/src/java/org/apache/struts/flow/core/VariableRegistrar.java
Sun Apr 10 19:50:40 2005
@@ -0,0 +1,58 @@
+/*
+ * Copyright 1999-2004 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.struts.flow.core;
+
+import org.mozilla.javascript.Scriptable;
+import org.apache.commons.chain.Context;
+
+/**
+ * Defines a variable registrar used to define either a static or
+ * call-specific variable in the global scope. Static variables are defined
+ * once per global scope, while call-specific variables can define instances
+ * of themselves for every script call.
+ */
+public interface VariableRegistrar {
+
+ /**
+ * Gets the Class object for the variable
+ */
+ public Class getClassInstance();
+
+ /**
+ * Gets the name of the variable class
+ */
+ public String getClassName();
+
+ /**
+ * Gets an instance of the variable
+ *
+ * @param scope The scope the variable will be placed in
+ * @param ctx The commons chain context for the call, null if defining
+ * a static variable
+ */
+ public Object getInstance(Scriptable scope, Context ctx);
+
+ /**
+ * Gets the variable name
+ */
+ public String getName();
+
+ /**
+ * Returns whether this variable is call-specific or static
+ */
+ public boolean isCallSpecific();
+}
+
Propchange:
struts/flow/trunk/src/java/org/apache/struts/flow/core/VariableRegistrar.java
------------------------------------------------------------------------------
svn:executable = *
Modified: struts/flow/trunk/src/java/system.js
URL:
http://svn.apache.org/viewcvs/struts/flow/trunk/src/java/system.js?view=diff&r1=160819&r2=160820
==============================================================================
--- struts/flow/trunk/src/java/system.js (original)
+++ struts/flow/trunk/src/java/system.js Sun Apr 10 19:50:40 2005
@@ -7,7 +7,7 @@
// Use default ttl value from continuation manager
var timeToLive = 0;
- var kont = new WebContinuation(context, k, lastWebCont, timeToLive);
+ var kont = new WebContinuation(flow, k, lastWebCont, timeToLive);
if (this.rootContinuation == null) {
this.rootContinuation = kont;
}
@@ -29,7 +29,7 @@
lastContinuation = kont;
// process the resulting request differently if a client-side call
- func = context.get("func");
+ func = flow.get("func");
if (func != null) {
var ret;
var callFunc = false;
@@ -54,7 +54,7 @@
log.warn("Invalid remote function attempt:"+func);
} else {
var json;
- eval("json = "+context.get("json"));
+ eval("json = "+flow.get("json"));
ret = this[func].apply(this, json);
}
kont = _forwardAndWait("n/a", ret);
@@ -70,11 +70,11 @@
// Use default ttl value from continuation manager
var timeToLive = 0;
- var kont = new WebContinuation(context, k, lastContinuation, timeToLive);
+ var kont = new WebContinuation(flow, k, lastContinuation, timeToLive);
- context.put(Constants.FORWARD_NAME_KEY, name);
- context.put(Constants.CONTINUATION_ID_KEY, kont.id);
- context.put(Constants.BIZ_DATA_KEY, atts);
+ flow.put(Packages.org.apache.struts.flow.Constants.FORWARD_NAME_KEY, name);
+ flow.put(Packages.org.apache.struts.flow.Constants.CONTINUATION_ID_KEY,
kont.id);
+ flow.put(Packages.org.apache.struts.flow.Constants.BIZ_DATA_KEY, atts);
suicide();
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]