Return-Path: Delivered-To: apmail-xml-cocoon-cvs-archive@xml.apache.org Received: (qmail 23750 invoked by uid 500); 12 Apr 2003 21:29:06 -0000 Mailing-List: contact cocoon-cvs-help@xml.apache.org; run by ezmlm Precedence: bulk Reply-To: cocoon-dev@xml.apache.org list-help: list-unsubscribe: list-post: Delivered-To: mailing list cocoon-cvs@xml.apache.org Received: (qmail 23739 invoked by uid 500); 12 Apr 2003 21:29:06 -0000 Delivered-To: apmail-cocoon-2.1-cvs@apache.org Received: (qmail 23736 invoked from network); 12 Apr 2003 21:29:06 -0000 Received: from icarus.apache.org (208.185.179.13) by daedalus.apache.org with SMTP; 12 Apr 2003 21:29:06 -0000 Received: (qmail 3536 invoked by uid 1544); 12 Apr 2003 21:29:05 -0000 Date: 12 Apr 2003 21:29:05 -0000 Message-ID: <20030412212905.3535.qmail@icarus.apache.org> From: coliver@apache.org To: cocoon-2.1-cvs@apache.org Subject: cvs commit: cocoon-2.1/src/scratchpad/src/org/apache/cocoon/generation FlowVelocityGenerator.java X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N coliver 2003/04/12 14:29:05 Modified: src/scratchpad/src/org/apache/cocoon/generation FlowVelocityGenerator.java Log: Incorporated patch from Albert Kwong and attempted to make backward-compatible with VelocityGenerator Revision Changes Path 1.4 +583 -380 cocoon-2.1/src/scratchpad/src/org/apache/cocoon/generation/FlowVelocityGenerator.java Index: FlowVelocityGenerator.java =================================================================== RCS file: /home/cvs/cocoon-2.1/src/scratchpad/src/org/apache/cocoon/generation/FlowVelocityGenerator.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- FlowVelocityGenerator.java 6 Apr 2003 03:04:27 -0000 1.3 +++ FlowVelocityGenerator.java 12 Apr 2003 21:29:05 -0000 1.4 @@ -63,7 +63,11 @@ import org.apache.cocoon.ResourceNotFoundException; import org.apache.cocoon.components.flow.WebContinuation; import org.apache.cocoon.environment.Environment; +import org.apache.cocoon.environment.ObjectModelHelper; +import org.apache.cocoon.environment.Request; +import org.apache.cocoon.environment.Response; import org.apache.cocoon.environment.SourceResolver; +import org.apache.cocoon.environment.Session; import org.apache.commons.collections.ExtendedProperties; import org.apache.commons.jxpath.DynamicPropertyHandler; import org.apache.commons.jxpath.JXPathBeanInfo; @@ -73,13 +77,24 @@ import org.apache.velocity.app.Velocity; import org.apache.velocity.app.VelocityEngine; import org.apache.velocity.context.Context; +import org.apache.velocity.VelocityContext; import org.apache.velocity.runtime.RuntimeServices; import org.apache.velocity.runtime.log.LogSystem; import org.xml.sax.InputSource; import org.xml.sax.SAXException; import org.xml.sax.SAXParseException; -import org.mozilla.javascript.*; -import org.apache.velocity.util.introspection.*; +import org.mozilla.javascript.Scriptable; +import org.mozilla.javascript.Wrapper; +import org.mozilla.javascript.JavaScriptException; +import org.mozilla.javascript.ScriptableObject; +import org.mozilla.javascript.NativeArray; +import org.mozilla.javascript.Undefined; +import org.mozilla.javascript.ScriptRuntime; +import org.apache.velocity.util.introspection.UberspectImpl; +import org.apache.velocity.util.introspection.VelMethod; +import org.apache.velocity.util.introspection.VelPropertyGet; +import org.apache.velocity.util.introspection.VelPropertySet; +import org.apache.velocity.util.introspection.Info; import java.beans.PropertyDescriptor; import java.io.IOException; import java.io.InputStream; @@ -155,279 +170,453 @@ implements Initializable, Configurable, LogSystem { /** + *

Velocity context implementation specific to the Servlet environment.

+ * + *

It provides the following special features:

+ *
    + *
  • puts the request, response, session, and servlet context objects + * into the Velocity context for direct access, and keeps them + * read-only
  • + *
  • supports a read-only toolbox of view tools
  • + *
  • auto-searches servlet request attributes, session attributes and + * servlet context attribues for objects
  • + *
+ * + *

The {@link #internalGet(String key)} method implements the following search order + * for objects:

+ *
    + *
  1. servlet request, servlet response, servlet session, servlet context
  2. + *
  3. toolbox
  4. + *
  5. local hashtable of objects (traditional use)
  6. + *
  7. servlet request attribues, servlet session attribute, servlet context + * attributes
  8. + *
+ * + *

The purpose of this class is to make it easy for web designer to work + * with Java servlet based web applications. They do not need to be concerned + * with the concepts of request, session or application attributes and the + * live time of objects in these scopes.

+ * + *

Note that the put() method always puts objects into the local hashtable. + *

+ * + *

Acknowledge: the source code is borrowed from the jakarta-velocity-tools + * project with slight modifications.

+ * + * @author Albert Kwong + * @author Geir Magnusson Jr. + * @author Gabe Sidler + * @author Albert Kwong + */ + public static class ChainedContext extends VelocityContext + { + + /** + * A local reference to the current servlet request. + */ + private Request request; + + /** + * A local reference to the current servlet response. + */ + private Response response; + + /** + * A local reference to the servlet session. + */ + private Session session; + + /** + * A local reference to the servlet context. + */ + private org.apache.cocoon.environment.Context application; + + /** + * A local reference to pipeline parameters. + */ + private Parameters parameters; + + /** + * Key to the HTTP request object. + */ + public static final String REQUEST = "request"; + + /** + * Key to the HTTP response object. + */ + public static final String RESPONSE = "response"; + + /** + * Key to the HTTP session object. + */ + public static final String SESSION = "session"; + + /** + * Key to the servlet context object. + */ + public static final String APPLICATION = "context"; + + /** + * Key to the servlet context object. + */ + public static final String PARAMETERS = "parameters"; + + + /** + * Default constructor. + */ + public ChainedContext(org.apache.velocity.context.Context ctx, + Request request, + Response response, + org.apache.cocoon.environment.Context application, + Parameters parameters) + { + super(null, ctx); + this.request = request; + this.response = response; + this.session = request.getSession(false); + this.application = application; + this.parameters = parameters; + } + + + /** + *

Looks up and returns the object with the specified key.

+ * + *

See the class documentation for more details.

+ * + * @param key the key of the object requested + * + * @return the requested object or null if not found + */ + public Object internalGet( String key ) + { + // make the four scopes of the Apocalypse Read only + if ( key.equals( REQUEST )) + { + return request; + } + else if( key.equals(RESPONSE) ) + { + return response; + } + else if ( key.equals(SESSION) ) + { + return session; + } + else if ( key.equals(APPLICATION)) + { + return application; + } + else if ( key.equals(PARAMETERS)) + { + return parameters; + } + + Object o = null; + + // try the local hashtable + o = super.internalGet( key ); + + // if not found, wander down the scopes... + if (o == null) + { + o = request.getAttribute( key ); + + if ( o == null ) + { + if ( session != null ) + { + o = session.getAttribute( key ); + } + + if ( o == null ) + { + o = application.getAttribute( key ); + } + } + } + + return o; + } + + + } // ChainedContext + + /** * Velocity Introspector that supports Rhino JavaScript objects * as well as Java Objects * */ public static class JSIntrospector extends UberspectImpl { - - public static class JSMethod implements VelMethod { - - Scriptable scope; - String name; - - public JSMethod(Scriptable scope, String name) { - this.scope = scope; - this.name = name; - } - - public Object invoke(Object thisArg, Object[] args) - throws Exception { - org.mozilla.javascript.Context cx = org.mozilla.javascript.Context.enter(); - try { - Object result; - Scriptable thisObj; - if (!(thisArg instanceof Scriptable)) { - thisObj = org.mozilla.javascript.Context.toObject(thisArg, scope); - } else { - thisObj = (Scriptable)thisArg; - } - result = ScriptableObject.getProperty(thisObj, name); - Object[] newArgs = null; - if (args != null) { - newArgs = new Object[args.length]; - for (int i = 0; i < args.length; i++) { - newArgs[i] = args[i]; - if (args[i] != null && - !(args[i] instanceof Number) && - !(args[i] instanceof Boolean) && - !(args[i] instanceof String) && - !(args[i] instanceof Scriptable)) { - newArgs[i] = org.mozilla.javascript.Context.toObject(args[i], scope); - } - } - } - result = ScriptRuntime.call(cx, result, thisObj, - newArgs, scope); - if (result == Undefined.instance || - result == ScriptableObject.NOT_FOUND) { - result = null; - } else while (result instanceof Wrapper) { - result = ((Wrapper)result).unwrap(); - } - return result; - } catch (JavaScriptException e) { - throw new java.lang.reflect.InvocationTargetException(e); - } finally { - org.mozilla.javascript.Context.exit(); - } - } - - public boolean isCacheable() { - return false; - } - - public String getMethodName() { - return name; - } - - public Class getReturnType() { - return Object.class; - } - - } - - public static class JSPropertyGet implements VelPropertyGet { - - Scriptable scope; - String name; - - public JSPropertyGet(Scriptable scope, String name) { - this.scope = scope; - this.name = name; - } - - public Object invoke(Object thisArg) throws Exception { - org.mozilla.javascript.Context.enter(); - try { - Scriptable thisObj; - if (!(thisArg instanceof Scriptable)) { - thisObj = org.mozilla.javascript.Context.toObject(thisArg, scope); - } else { - thisObj = (Scriptable)thisArg; - } - Object result = ScriptableObject.getProperty(thisObj, name); - if (result == Undefined.instance || - result == ScriptableObject.NOT_FOUND) { - result = null; - } else while (result instanceof Wrapper) { - result = ((Wrapper)result).unwrap(); - } - return result; - } finally { - org.mozilla.javascript.Context.exit(); - } - } - - public boolean isCacheable() { - return false; - } - - public String getMethodName() { - return name; - } - - } - - public static class JSPropertySet implements VelPropertySet { - - Scriptable scope; - String name; - - public JSPropertySet(Scriptable scope, String name) { - this.scope = scope; - this.name = name; - } - - public Object invoke(Object thisArg, Object rhs) throws Exception { - org.mozilla.javascript.Context.enter(); - try { - Scriptable thisObj; - Object arg = rhs; - if (!(thisArg instanceof Scriptable)) { - thisObj = org.mozilla.javascript.Context.toObject(thisArg, scope); - } else { - thisObj = (Scriptable)thisArg; - } - if (arg != null && - !(arg instanceof Number) && - !(arg instanceof Boolean) && - !(arg instanceof String) && - !(arg instanceof Scriptable)) { - arg = org.mozilla.javascript.Context.toObject(arg, scope); - } - ScriptableObject.putProperty(thisObj, name, arg); - return rhs; - } finally { - org.mozilla.javascript.Context.exit(); - } - } - - public boolean isCacheable() { - return false; - } - - public String getMethodName() { - return name; - } - } - - public static class NativeArrayIterator implements Iterator { - - NativeArray arr; - int index; - - public NativeArrayIterator(NativeArray arr) { - this.arr = arr; - this.index = 0; - } - - public boolean hasNext() { - return index < (int)arr.jsGet_length(); - } - - public Object next() { - org.mozilla.javascript.Context.enter(); - try { - Object result = arr.get(index++, arr); - if (result == Undefined.instance || - result == ScriptableObject.NOT_FOUND) { - result = null; - } else while (result instanceof Wrapper) { - result = ((Wrapper)result).unwrap(); - } - return result; - } finally { - org.mozilla.javascript.Context.exit(); - } - } - - public void remove() { - arr.delete(index); - } - } - - public static class ScriptableIterator implements Iterator { - - Scriptable scope; - Object[] ids; - int index; - - public ScriptableIterator(Scriptable scope) { - this.scope = scope; - this.ids = scope.getIds(); - this.index = 0; - } - - public boolean hasNext() { - return index < ids.length; - } - - public Object next() { - org.mozilla.javascript.Context.enter(); - try { - Object result = - ScriptableObject.getProperty(scope, - ids[index++].toString()); - if (result == Undefined.instance || - result == ScriptableObject.NOT_FOUND) { - result = null; - } else while (result instanceof Wrapper) { - result = ((Wrapper)result).unwrap(); - } - return result; - } finally { - org.mozilla.javascript.Context.exit(); - } - } - - public void remove() { - org.mozilla.javascript.Context.enter(); - try { - scope.delete(ids[index].toString()); - } finally { - org.mozilla.javascript.Context.exit(); - } - } - } - - public Iterator getIterator(Object obj, Info i) - throws Exception { - if (!(obj instanceof Scriptable)) { - return super.getIterator(obj, i); - } - if (obj instanceof NativeArray) { - return new NativeArrayIterator((NativeArray)obj); - } - return new ScriptableIterator((Scriptable)obj); - } - - public VelMethod getMethod(Object obj, String methodName, - Object[] args, Info i) - throws Exception { - if (!(obj instanceof Scriptable)) { - return super.getMethod(obj, methodName, args, i); - } - return new JSMethod((Scriptable)obj, methodName); - } - - public VelPropertyGet getPropertyGet(Object obj, String identifier, - Info i) - throws Exception { - if (!(obj instanceof Scriptable)) { - return super.getPropertyGet(obj, identifier, i); - } - return new JSPropertyGet((Scriptable)obj, identifier); - } - - public VelPropertySet getPropertySet(Object obj, String identifier, - Object arg, Info i) - throws Exception { - if (!(obj instanceof Scriptable)) { - return super.getPropertySet(obj, identifier, arg, i); - } - return new JSPropertySet((Scriptable)obj, identifier); - } + + public static class JSMethod implements VelMethod { + + Scriptable scope; + String name; + + public JSMethod(Scriptable scope, String name) { + this.scope = scope; + this.name = name; + } + + public Object invoke(Object thisArg, Object[] args) + throws Exception { + org.mozilla.javascript.Context cx = org.mozilla.javascript.Context.enter(); + try { + Object result; + Scriptable thisObj; + if (!(thisArg instanceof Scriptable)) { + thisObj = org.mozilla.javascript.Context.toObject(thisArg, scope); + } else { + thisObj = (Scriptable)thisArg; + } + result = ScriptableObject.getProperty(thisObj, name); + Object[] newArgs = null; + if (args != null) { + newArgs = new Object[args.length]; + for (int i = 0; i < args.length; i++) { + newArgs[i] = args[i]; + if (args[i] != null && + !(args[i] instanceof Number) && + !(args[i] instanceof Boolean) && + !(args[i] instanceof String) && + !(args[i] instanceof Scriptable)) { + newArgs[i] = org.mozilla.javascript.Context.toObject(args[i], scope); + } + } + } + result = ScriptRuntime.call(cx, result, thisObj, + newArgs, scope); + if (result == Undefined.instance || + result == ScriptableObject.NOT_FOUND) { + result = null; + } else while (result instanceof Wrapper) { + result = ((Wrapper)result).unwrap(); + } + return result; + } catch (JavaScriptException e) { + throw new java.lang.reflect.InvocationTargetException(e); + } finally { + org.mozilla.javascript.Context.exit(); + } + } + + public boolean isCacheable() { + return false; + } + + public String getMethodName() { + return name; + } + + public Class getReturnType() { + return Object.class; + } + + } + + public static class JSPropertyGet implements VelPropertyGet { + + Scriptable scope; + String name; + + public JSPropertyGet(Scriptable scope, String name) { + this.scope = scope; + this.name = name; + } + + public Object invoke(Object thisArg) throws Exception { + org.mozilla.javascript.Context.enter(); + try { + Scriptable thisObj; + if (!(thisArg instanceof Scriptable)) { + thisObj = org.mozilla.javascript.Context.toObject(thisArg, scope); + } else { + thisObj = (Scriptable)thisArg; + } + Object result = ScriptableObject.getProperty(thisObj, name); + if (result == Undefined.instance || + result == ScriptableObject.NOT_FOUND) { + result = null; + } else while (result instanceof Wrapper) { + result = ((Wrapper)result).unwrap(); + } + return result; + } finally { + org.mozilla.javascript.Context.exit(); + } + } + + public boolean isCacheable() { + return false; + } + + public String getMethodName() { + return name; + } + + } + + public static class JSPropertySet implements VelPropertySet { + + Scriptable scope; + String name; + + public JSPropertySet(Scriptable scope, String name) { + this.scope = scope; + this.name = name; + } + + public Object invoke(Object thisArg, Object rhs) throws Exception { + org.mozilla.javascript.Context.enter(); + try { + Scriptable thisObj; + Object arg = rhs; + if (!(thisArg instanceof Scriptable)) { + thisObj = org.mozilla.javascript.Context.toObject(thisArg, scope); + } else { + thisObj = (Scriptable)thisArg; + } + if (arg != null && + !(arg instanceof Number) && + !(arg instanceof Boolean) && + !(arg instanceof String) && + !(arg instanceof Scriptable)) { + arg = org.mozilla.javascript.Context.toObject(arg, scope); + } + ScriptableObject.putProperty(thisObj, name, arg); + return rhs; + } finally { + org.mozilla.javascript.Context.exit(); + } + } + + public boolean isCacheable() { + return false; + } + + public String getMethodName() { + return name; + } + } + + public static class NativeArrayIterator implements Iterator { + + NativeArray arr; + int index; + + public NativeArrayIterator(NativeArray arr) { + this.arr = arr; + this.index = 0; + } + + public boolean hasNext() { + return index < (int)arr.jsGet_length(); + } + + public Object next() { + org.mozilla.javascript.Context.enter(); + try { + Object result = arr.get(index++, arr); + if (result == Undefined.instance || + result == ScriptableObject.NOT_FOUND) { + result = null; + } else while (result instanceof Wrapper) { + result = ((Wrapper)result).unwrap(); + } + return result; + } finally { + org.mozilla.javascript.Context.exit(); + } + } + + public void remove() { + arr.delete(index); + } + } + + public static class ScriptableIterator implements Iterator { + + Scriptable scope; + Object[] ids; + int index; + + public ScriptableIterator(Scriptable scope) { + this.scope = scope; + this.ids = scope.getIds(); + this.index = 0; + } + + public boolean hasNext() { + return index < ids.length; + } + + public Object next() { + org.mozilla.javascript.Context.enter(); + try { + Object result = + ScriptableObject.getProperty(scope, + ids[index++].toString()); + if (result == Undefined.instance || + result == ScriptableObject.NOT_FOUND) { + result = null; + } else while (result instanceof Wrapper) { + result = ((Wrapper)result).unwrap(); + } + return result; + } finally { + org.mozilla.javascript.Context.exit(); + } + } + + public void remove() { + org.mozilla.javascript.Context.enter(); + try { + scope.delete(ids[index].toString()); + } finally { + org.mozilla.javascript.Context.exit(); + } + } + } + + public Iterator getIterator(Object obj, Info i) + throws Exception { + if (!(obj instanceof Scriptable)) { + return super.getIterator(obj, i); + } + if (obj instanceof NativeArray) { + return new NativeArrayIterator((NativeArray)obj); + } + return new ScriptableIterator((Scriptable)obj); + } + + public VelMethod getMethod(Object obj, String methodName, + Object[] args, Info i) + throws Exception { + if (!(obj instanceof Scriptable)) { + return super.getMethod(obj, methodName, args, i); + } + return new JSMethod((Scriptable)obj, methodName); + } + + public VelPropertyGet getPropertyGet(Object obj, String identifier, + Info i) + throws Exception { + if (!(obj instanceof Scriptable)) { + return super.getPropertyGet(obj, identifier, i); + } + return new JSPropertyGet((Scriptable)obj, identifier); + } + + public VelPropertySet getPropertySet(Object obj, String identifier, + Object arg, Info i) + throws Exception { + if (!(obj instanceof Scriptable)) { + return super.getPropertySet(obj, identifier, arg, i); + } + return new JSPropertySet((Scriptable)obj, identifier); + } } /** @@ -552,6 +741,7 @@ final private static String CONTEXT_SOURCE_CACHE_KEY = "source-cache"; private VelocityEngine tmplEngine; + private boolean tmplEngineInitialized; private DefaultContext resolverContext; private Context velocityContext; private boolean activeFlag; @@ -637,7 +827,7 @@ * @see org.apache.avalon.framework.activity.Initializable#initialize */ public void initialize() throws Exception { - this.tmplEngine.init(); + //this.tmplEngine.init(); } /** @@ -657,128 +847,138 @@ // FIXME: Initialize the Velocity context. Use objectModel to pass these final Object bean = ((Environment) resolver).getAttribute("bean-dict"); - final WebContinuation kont = + if (bean != null) { + final WebContinuation kont = (WebContinuation) ((Environment) resolver).getAttribute("kont"); - - // This velocity context provides two variables: "this" which represents the - // bean object passed to sendPage*() and "continuation" which is the - // current continuation. The immediate properties of the bean object are - // also available in the context. - // - // Hack? I use JXPath to determine the properties of the bean object - final JXPathBeanInfo bi = JXPathIntrospector.getBeanInfo(bean.getClass()); - DynamicPropertyHandler h = null; - final PropertyDescriptor[] props; - if (bi.isDynamic()) { - Class cl = bi.getDynamicPropertyHandlerClass(); - try { - h = (DynamicPropertyHandler) cl.newInstance(); - } catch (Exception exc) { - exc.printStackTrace(); + + // This velocity context provides two variables: "this" which represents the + // bean object passed to sendPage*() and "continuation" which is the + // current continuation. The immediate properties of the bean object are + // also available in the context. + // + // Hack? I use JXPath to determine the properties of the bean object + final JXPathBeanInfo bi = JXPathIntrospector.getBeanInfo(bean.getClass()); + DynamicPropertyHandler h = null; + final PropertyDescriptor[] props; + if (bi.isDynamic()) { + Class cl = bi.getDynamicPropertyHandlerClass(); + try { + h = (DynamicPropertyHandler) cl.newInstance(); + } catch (Exception exc) { + exc.printStackTrace(); + h = null; + } + props = null; + } else { h = null; + props = bi.getPropertyDescriptors(); } - props = null; - } else { - h = null; - props = bi.getPropertyDescriptors(); - } - final DynamicPropertyHandler handler = h; - - this.velocityContext = new Context() { - public Object put(String key, Object value) { - if (key.equals("this") || key.equals("continuation")) { - return value; - } - if (handler != null) { - handler.setProperty(bean, key, value); - return value; - } else { - for (int i = 0; i < props.length; i++) { - if (props[i].getName().equals(key)) { - try { - return props[i].getWriteMethod().invoke(bean, new Object[]{value}); - } catch (Exception ignored) { - break; + final DynamicPropertyHandler handler = h; + + this.velocityContext = new Context() { + public Object put(String key, Object value) { + if (key.equals("flowContext") + || key.equals("continuation")) { + return value; + } + if (handler != null) { + handler.setProperty(bean, key, value); + return value; + } else { + for (int i = 0; i < props.length; i++) { + if (props[i].getName().equals(key)) { + try { + return props[i].getWriteMethod().invoke(bean, new Object[]{value}); + } catch (Exception ignored) { + break; + } + } } + return value; } } - return value; - } - } - - public boolean containsKey(Object key) { - if (key.equals("this") || key.equals("continuation")) { - return true; - } - if (handler != null) { - String[] result = handler.getPropertyNames(bean); - for (int i = 0; i < result.length; i++) { - if (key.equals(result[i])) { + + public boolean containsKey(Object key) { + if (key.equals("flowContext") + || key.equals("continuation")) { return true; } + if (handler != null) { + String[] result = handler.getPropertyNames(bean); + for (int i = 0; i < result.length; i++) { + if (key.equals(result[i])) { + return true; + } + } + } else { + for (int i = 0; i < props.length; i++) { + if (key.equals(props[i].getName())) { + return true; + } + } + } + return false; } - } else { - for (int i = 0; i < props.length; i++) { - if (key.equals(props[i].getName())) { - return true; + + public Object[] getKeys() { + Object[] result = null; + if (handler != null) { + result = handler.getPropertyNames(bean); + } else { + result = new Object[props.length]; + for (int i = 0; i < props.length; i++) { + result[i] = props[i].getName(); + } } + Set set = new HashSet(); + for (int i = 0; i < result.length; i++) { + set.add(result[i]); + } + set.add("flowContext"); + set.add("continuation"); + result = new Object[set.size()]; + set.toArray(result); + return result; } - } - return false; - } - - public Object[] getKeys() { - Object[] result = null; - if (handler != null) { - result = handler.getPropertyNames(bean); - } else { - result = new Object[props.length]; - for (int i = 0; i < props.length; i++) { - result[i] = props[i].getName(); - } - } - Set set = new HashSet(); - for (int i = 0; i < result.length; i++) { - set.add(result[i]); - } - set.add("this"); - set.add("continuation"); - result = new Object[set.size()]; - set.toArray(result); - return result; - } - - public Object get(String key) { - if (key.equals("this")) { - return bean; - } - if (key.equals("continuation")) { - return kont; - } - if (handler != null) { - return handler.getProperty(bean, key.toString()); - } else { - for (int i = 0; i < props.length; i++) { - if (props[i].getName().equals(key)) { - try { - return props[i].getReadMethod().invoke(bean, null); - } catch (Exception ignored) { - break; + + public Object get(String key) { + if (key.equals("flowContext")) { + return bean; + } + if (key.equals("continuation")) { + return kont; + } + if (handler != null) { + return handler.getProperty(bean, key.toString()); + } else { + for (int i = 0; i < props.length; i++) { + if (props[i].getName().equals(key)) { + try { + return props[i].getReadMethod().invoke(bean, null); + } catch (Exception ignored) { + break; + } + } } + return null; } } - return null; - } - } - - public Object remove(Object key) { - // not implemented - return key; - } - }; + + public Object remove(Object key) { + // not implemented + return key; + } + }; + } + this.velocityContext = + new ChainedContext (this.velocityContext, + ObjectModelHelper.getRequest(objectModel), + ObjectModelHelper.getResponse(objectModel), + ObjectModelHelper.getContext(objectModel), + params); + this.velocityContext.put("template", src); this.activeFlag = true; } - /** * Free up the VelocityContext associated with the pipeline, and * release any Source objects resolved by the resource loader. @@ -820,7 +1020,10 @@ if (getLogger().isDebugEnabled()) { getLogger().debug("Processing File: " + super.source); } - + if (!tmplEngineInitialized) { + tmplEngine.init(); + tmplEngineInitialized = true; + } /* lets render a template */ this.tmplEngine.mergeTemplate(super.source, velocityContext, w); @@ -847,8 +1050,8 @@ } message += lineStr + "\n"; } - String columnIndicator = ""; if (column > 0) { + String columnIndicator = ""; for (int i = 1; i < column; i++) { columnIndicator += " "; }