cocoon-cvs mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From lgaw...@apache.org
Subject svn commit: r111395 - in cocoon/trunk/src/blocks/template/java/org/apache/cocoon: el el/jexl el/util template/jxtg template/jxtg/environment template/jxtg/expression template/jxtg/script template/jxtg/script/event template/v2/generation template/v2/script template/v2/tag template/v2/tag/samples util
Date Thu, 09 Dec 2004 15:41:03 GMT
Author: lgawron
Date: Thu Dec  9 07:41:02 2004
New Revision: 111395

URL: http://svn.apache.org/viewcvs?view=rev&rev=111395
Log:
svn:eol-style native, svn:keywords Id
Modified:
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/el/AbstractExpression.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/el/Context.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/el/DefaultContext.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/el/Expression.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/el/ExpressionCompiler.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/el/GenericExpressionCompiler.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/el/jexl/JexlContext.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/el/jexl/JexlExpression.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/el/jexl/JexlExpressionCompiler.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/el/util/ELUtils.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/el/util/ParseHandler.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/JXTemplateGenerator.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/TransformerAdapter.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/ErrorHolder.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JSIntrospector.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JXCacheKey.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JXSourceValidity.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/LocatorFacade.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/MyVariables.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/ValueHelper.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/JXTExpression.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/Literal.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/MyJexlContext.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/Subst.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Parser.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/AttributeEvent.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/Characters.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/CopyAttribute.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndCDATA.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndDTD.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndDocument.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndElement.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndEntity.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndInstruction.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndPrefixMapping.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/Event.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/IgnorableWhitespace.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/LoopTagStatus.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/ProcessingInstruction.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/SkippedEntity.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartCDATA.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartChoose.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartComment.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDTD.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDefine.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDocument.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartElement.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEntity.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEval.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEvalBody.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartForEach.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatDate.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatNumber.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartIf.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartImport.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartInstruction.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartOtherwise.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartOut.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartParameter.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartPrefixMapping.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartSet.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartTemplate.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartWhen.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/SubstituteAttribute.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/TextEvent.java   (contents, props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/v2/generation/TemplateGenerator.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/v2/script/AbstractToken.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/v2/script/AttributeToken.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/v2/script/CharactersToken.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/v2/script/ElementToken.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/v2/script/ExpressionToken.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/v2/script/PlainElementToken.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/v2/script/Script.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/v2/script/ScriptCompiler.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/v2/script/ScriptContext.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/v2/script/ScriptInvoker.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/v2/script/TagRepository.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/v2/script/Token.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/v2/tag/AbstractTag.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/v2/tag/Tag.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/v2/tag/samples/DuplicateTag.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/util/ContextStackMap.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/util/IncludingConfiguration.java   (props changed)
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/util/TypeUtils.java   (props changed)

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/JXTemplateGenerator.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/JXTemplateGenerator.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/JXTemplateGenerator.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/JXTemplateGenerator.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/JXTemplateGenerator.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/JXTemplateGenerator.java	Thu Dec  9 07:41:02 2004
@@ -1,1230 +1,1230 @@
-/*
- * 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.cocoon.template.jxtg;
-
-import java.beans.PropertyDescriptor;
-import java.io.IOException;
-import java.io.Serializable;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.avalon.framework.parameters.Parameters;
-import org.apache.cocoon.ProcessingException;
-import org.apache.cocoon.caching.CacheableProcessingComponent;
-import org.apache.cocoon.components.flow.FlowHelper;
-import org.apache.cocoon.components.flow.WebContinuation;
-import org.apache.cocoon.components.flow.javascript.fom.FOM_JavaScriptFlowHelper;
-import org.apache.cocoon.components.source.SourceUtil;
-import org.apache.cocoon.environment.ObjectModelHelper;
-import org.apache.cocoon.environment.Request;
-import org.apache.cocoon.environment.SourceResolver;
-import org.apache.cocoon.generation.ServiceableGenerator;
-import org.apache.cocoon.template.jxtg.environment.ErrorHolder;
-import org.apache.cocoon.template.jxtg.environment.JSIntrospector;
-import org.apache.cocoon.template.jxtg.environment.JXCacheKey;
-import org.apache.cocoon.template.jxtg.environment.JXSourceValidity;
-import org.apache.cocoon.template.jxtg.environment.LocatorFacade;
-import org.apache.cocoon.template.jxtg.environment.MyVariables;
-import org.apache.cocoon.template.jxtg.environment.ValueHelper;
-import org.apache.cocoon.template.jxtg.expression.JXTExpression;
-import org.apache.cocoon.template.jxtg.expression.Literal;
-import org.apache.cocoon.template.jxtg.expression.MyJexlContext;
-import org.apache.cocoon.template.jxtg.expression.Subst;
-import org.apache.cocoon.template.jxtg.script.Parser;
-import org.apache.cocoon.template.jxtg.script.event.*;
-import org.apache.cocoon.xml.IncludeXMLConsumer;
-import org.apache.cocoon.xml.XMLConsumer;
-import org.apache.cocoon.xml.XMLUtils;
-import org.apache.cocoon.xml.dom.DOMBuilder;
-import org.apache.cocoon.xml.dom.DOMStreamer;
-import org.apache.commons.jexl.Expression;
-import org.apache.commons.jexl.JexlContext;
-import org.apache.commons.jexl.util.Introspector;
-import org.apache.commons.jexl.util.introspection.Info;
-import org.apache.commons.jxpath.CompiledExpression;
-import org.apache.commons.jxpath.DynamicPropertyHandler;
-import org.apache.commons.jxpath.JXPathBeanInfo;
-import org.apache.commons.jxpath.JXPathContext;
-import org.apache.commons.jxpath.JXPathContextFactory;
-import org.apache.commons.jxpath.JXPathIntrospector;
-import org.apache.commons.jxpath.Pointer;
-import org.apache.commons.jxpath.Variables;
-import org.apache.commons.lang.ArrayUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.excalibur.source.Source;
-import org.apache.excalibur.source.SourceException;
-import org.apache.excalibur.source.SourceValidity;
-import org.apache.excalibur.xml.sax.XMLizable;
-import org.mozilla.javascript.NativeArray;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.Attributes;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.AttributesImpl;
-import org.xml.sax.helpers.LocatorImpl;
-
-/**
- * @cocoon.sitemap.component.documentation Provides a generic page template with
- *                                         embedded JSTL and XPath expression
- *                                         substitution to access data sent by
- *                                         Cocoon Flowscripts.
- * 
- * @cocoon.sitemap.component.name jx
- * @cocoon.sitemap.component.label content
- * @cocoon.sitemap.component.logger sitemap.generator.jx
- * 
- * @cocoon.sitemap.component.pooling.min 2
- * @cocoon.sitemap.component.pooling.max 16
- * @cocoon.sitemap.component.pooling.grow 2
- * 
- * 
- * @version CVS $Id: JXTemplateGenerator.java 106437 2004-11-24 17:35:45Z unico $
- */
-public class JXTemplateGenerator extends ServiceableGenerator implements
-        CacheableProcessingComponent {
-    /** The namespace used by this generator */
-    public final static String NS = "http://apache.org/cocoon/templates/jx/1.0";
-
-    private static final JXPathContextFactory jxpathContextFactory = JXPathContextFactory
-            .newInstance();
-    private static final Attributes EMPTY_ATTRS = new AttributesImpl();
-
-    private static final Iterator EMPTY_ITER = new Iterator() {
-        public boolean hasNext() {
-            return false;
-        }
-
-        public Object next() {
-            return null;
-        }
-
-        public void remove() {
-            // EMPTY
-        }
-    };
-
-    private static final Iterator NULL_ITER = new Iterator() {
-        public boolean hasNext() {
-            return true;
-        }
-
-        public Object next() {
-            return null;
-        }
-
-        public void remove() {
-            // EMPTY
-        }
-    };
-
-    public static final Locator NULL_LOCATOR = new LocatorImpl();
-
-    public final static String CACHE_KEY = "cache-key";
-    public final static String VALIDITY = "cache-validity";
-
-    private JXPathContext jxpathContext;
-    private MyJexlContext globalJexlContext;
-    private Variables variables;
-    private static Map cache = new HashMap();
-    private Source inputSource;
-    private Map definitions;
-    private Map cocoon;
-
-    static {
-        // Hack: there's no _nice_ way to add my introspector to Jexl right now
-        try {
-            Field field = Introspector.class.getDeclaredField("uberSpect");
-            field.setAccessible(true);
-            field.set(null, new JSIntrospector());
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    public XMLConsumer getConsumer() {
-        return this.xmlConsumer;
-    }
-
-    public JXPathContext getJXPathContext() {
-        return jxpathContext;
-    }
-
-    public MyJexlContext getJexlContext() {
-        return globalJexlContext;
-    }
-
-    public void recycle() {
-        if (this.resolver != null) {
-            this.resolver.release(this.inputSource);
-        }
-        this.inputSource = null;
-        this.jxpathContext = null;
-        this.globalJexlContext = null;
-        this.variables = null;
-        this.definitions = null;
-        this.cocoon = null;
-        super.recycle();
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.cocoon.sitemap.SitemapModelComponent#setup(org.apache.cocoon.environment.SourceResolver,
-     *      java.util.Map, java.lang.String,
-     *      org.apache.avalon.framework.parameters.Parameters)
-     */
-    public void setup(SourceResolver resolver, Map objectModel, String src,
-            Parameters parameters) throws ProcessingException, SAXException,
-            IOException {
-
-        super.setup(resolver, objectModel, src, parameters);
-        if (src != null) {
-            try {
-                this.inputSource = resolver.resolveURI(src);
-            } catch (SourceException se) {
-                throw SourceUtil.handle("Error during resolving of '" + src
-                        + "'.", se);
-            }
-            final String uri = inputSource.getURI();
-            boolean regenerate = false;
-            StartDocument startEvent = null;
-            synchronized (cache) {
-                startEvent = (StartDocument) cache.get(uri);
-                if (startEvent != null) {
-                    int valid = SourceValidity.UNKNOWN;
-                    if (startEvent.getCompileTime() != null) {
-                        valid = startEvent.getCompileTime().isValid();
-                    }
-                    if (valid == SourceValidity.UNKNOWN
-                            && startEvent.getCompileTime() != null) {
-                        SourceValidity validity = inputSource.getValidity();
-                        valid = startEvent.getCompileTime().isValid(validity);
-                    }
-                    if (valid != SourceValidity.VALID) {
-                        cache.remove(uri);
-                        regenerate = true;
-                    }
-                } else {
-                    regenerate = true;
-                }
-            }
-            if (regenerate) {
-                Parser parser = new Parser();
-                SourceUtil.parse(this.manager, this.inputSource, parser);
-                startEvent = parser.getStartEvent();
-                startEvent.setCompileTime(this.inputSource.getValidity());
-                synchronized (cache) {
-                    cache.put(uri, startEvent);
-                }
-            }
-        }
-        Object bean = FlowHelper.getContextObject(objectModel);
-        WebContinuation kont = FlowHelper.getWebContinuation(objectModel);
-        setContexts(bean, kont, parameters, objectModel);
-        this.definitions = new HashMap();
-    }
-
-    private void fillContext(Object contextObject, Map map) {
-        if (contextObject != null) {
-            // Hack: I use jxpath to populate the context object's properties
-            // in the jexl context
-            final JXPathBeanInfo bi = JXPathIntrospector
-                    .getBeanInfo(contextObject.getClass());
-            if (bi.isDynamic()) {
-                Class cl = bi.getDynamicPropertyHandlerClass();
-                try {
-                    DynamicPropertyHandler h = (DynamicPropertyHandler) cl
-                            .newInstance();
-                    String[] result = h.getPropertyNames(contextObject);
-                    int len = result.length;
-                    for (int i = 0; i < len; i++) {
-                        try {
-                            map.put(result[i], h.getProperty(contextObject,
-                                    result[i]));
-                        } catch (Exception exc) {
-                            exc.printStackTrace();
-                        }
-                    }
-                } catch (Exception ignored) {
-                    ignored.printStackTrace();
-                }
-            } else {
-                PropertyDescriptor[] props = bi.getPropertyDescriptors();
-                int len = props.length;
-                for (int i = 0; i < len; i++) {
-                    try {
-                        Method read = props[i].getReadMethod();
-                        if (read != null) {
-                            map.put(props[i].getName(), read.invoke(
-                                    contextObject, null));
-                        }
-                    } catch (Exception ignored) {
-                        ignored.printStackTrace();
-                    }
-                }
-            }
-        }
-    }
-
-    private void setContexts(Object contextObject, WebContinuation kont,
-            Parameters parameters, Map objectModel) {
-        final Request request = ObjectModelHelper.getRequest(objectModel);
-        final Object session = request.getSession(false);
-        final Object app = ObjectModelHelper.getContext(objectModel);
-        cocoon = new HashMap();
-        cocoon.put("request", FOM_JavaScriptFlowHelper
-                .getFOM_Request(objectModel));
-        if (session != null) {
-            cocoon.put("session", FOM_JavaScriptFlowHelper
-                    .getFOM_Session(objectModel));
-        }
-        cocoon.put("context", FOM_JavaScriptFlowHelper
-                .getFOM_Context(objectModel));
-        cocoon.put("continuation", FOM_JavaScriptFlowHelper
-                .getFOM_WebContinuation(objectModel));
-        cocoon.put("parameters", Parameters.toProperties(parameters));
-        this.variables = new MyVariables(cocoon, contextObject, kont, request,
-                session, app, parameters);
-        Map map;
-        if (contextObject instanceof Map) {
-            map = (Map) contextObject;
-        } else {
-            map = new HashMap();
-            fillContext(contextObject, map);
-        }
-        jxpathContext = jxpathContextFactory.newContext(null, contextObject);
-        jxpathContext.setVariables(variables);
-        jxpathContext.setLenient(parameters.getParameterAsBoolean(
-                "lenient-xpath", false));
-        globalJexlContext = new MyJexlContext();
-        globalJexlContext.setVars(map);
-        map = globalJexlContext.getVars();
-        map.put("cocoon", cocoon);
-        if (contextObject != null) {
-            map.put("flowContext", contextObject);
-            // FIXME (VG): Is this required (what it's used for - examples)?
-            // Here I use Rhino's live-connect objects to allow Jexl to call
-            // java constructors
-            Object javaPkg = FOM_JavaScriptFlowHelper
-                    .getJavaPackage(objectModel);
-            Object pkgs = FOM_JavaScriptFlowHelper.getPackages(objectModel);
-            map.put("java", javaPkg);
-            map.put("Packages", pkgs);
-        }
-        if (kont != null) {
-            map.put("continuation", kont);
-        }
-        map.put("request", request);
-        map.put("context", app);
-        map.put("parameters", parameters);
-        if (session != null) {
-            map.put("session", session);
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.cocoon.generation.Generator#generate()
-     */
-    public void generate() throws IOException, SAXException,
-            ProcessingException {
-        final String cacheKey = this.inputSource.getURI();
-
-        StartDocument startEvent;
-        synchronized (cache) {
-            startEvent = (StartDocument) cache.get(cacheKey);
-        }
-        performGeneration(this.xmlConsumer, globalJexlContext, jxpathContext,
-                null, startEvent, null);
-    }
-
-    public void performGeneration(final XMLConsumer consumer,
-            MyJexlContext jexlContext, JXPathContext jxpathContext,
-            StartElement macroCall, Event startEvent, Event endEvent)
-            throws SAXException {
-        cocoon.put("consumer", consumer);
-        execute(this.xmlConsumer, globalJexlContext, jxpathContext, null,
-                startEvent, null);
-    }
-
-    interface CharHandler {
-        public void characters(char[] ch, int offset, int length)
-                throws SAXException;
-    }
-
-    private void characters(JexlContext jexlContext,
-            JXPathContext jxpathContext, TextEvent event, CharHandler handler)
-            throws SAXException {
-        Iterator iter = event.getSubstitutions().iterator();
-        while (iter.hasNext()) {
-            Object subst = iter.next();
-            char[] chars;
-            if (subst instanceof char[]) {
-                chars = (char[]) subst;
-            } else {
-                JXTExpression expr = (JXTExpression) subst;
-                try {
-                    Object val = ValueHelper.getValue(expr, jexlContext,
-                            jxpathContext);
-                    chars = val != null ? val.toString().toCharArray()
-                            : ArrayUtils.EMPTY_CHAR_ARRAY;
-                } catch (Exception e) {
-                    throw new SAXParseException(e.getMessage(), event
-                            .getLocation(), e);
-                } catch (Error err) {
-                    throw new SAXParseException(err.getMessage(), event
-                            .getLocation(), new ErrorHolder(err));
-                }
-            }
-            handler.characters(chars, 0, chars.length);
-        }
-    }
-
-    /**
-     * dump a DOM document, using an IncludeXMLConsumer to filter out start/end
-     * document events
-     */
-    private void executeDOM(final XMLConsumer consumer,
-            MyJexlContext jexlContext, JXPathContext jxpathContext, Node node)
-            throws SAXException {
-        IncludeXMLConsumer includer = new IncludeXMLConsumer(consumer);
-        DOMStreamer streamer = new DOMStreamer(includer);
-        streamer.stream(node);
-    }
-
-    private void call(Locator location, StartElement macroCall,
-            final XMLConsumer consumer, MyJexlContext jexlContext,
-            JXPathContext jxpathContext, Event startEvent, Event endEvent)
-            throws SAXException {
-        try {
-            execute(consumer, jexlContext, jxpathContext, macroCall,
-                    startEvent, endEvent);
-        } catch (SAXParseException exc) {
-            throw new SAXParseException(macroCall.getLocalName() + ": "
-                    + exc.getMessage(), location, exc);
-        }
-    }
-
-    private void execute(final XMLConsumer consumer, MyJexlContext jexlContext,
-            JXPathContext jxpathContext, StartElement macroCall,
-            Event startEvent, Event endEvent) throws SAXException {
-        Event ev = startEvent;
-        LocatorFacade loc = new LocatorFacade(ev.getLocation());
-        consumer.setDocumentLocator(loc);
-        while (ev != endEvent) {
-            loc.setDocumentLocator(ev.getLocation());
-            if (ev instanceof Characters) {
-                TextEvent text = (TextEvent) ev;
-                Iterator iter = text.getSubstitutions().iterator();
-                while (iter.hasNext()) {
-                    Object subst = iter.next();
-                    char[] chars;
-                    if (subst instanceof char[]) {
-                        chars = (char[]) subst;
-                    } else {
-                        JXTExpression expr = (JXTExpression) subst;
-                        try {
-                            Object val = ValueHelper.getNode(expr, jexlContext,
-                                    jxpathContext);
-                            if (val instanceof Node) {
-                                executeDOM(consumer, jexlContext,
-                                        jxpathContext, (Node) val);
-                                continue;
-                            } else if (val instanceof NodeList) {
-                                NodeList nodeList = (NodeList) val;
-                                int len = nodeList.getLength();
-                                for (int i = 0; i < len; i++) {
-                                    Node n = nodeList.item(i);
-                                    executeDOM(consumer, jexlContext,
-                                            jxpathContext, n);
-                                }
-                                continue;
-                            } else if (val instanceof Node[]) {
-                                Node[] nodeList = (Node[]) val;
-                                int len = nodeList.length;
-                                for (int i = 0; i < len; i++) {
-                                    Node n = nodeList[i];
-                                    executeDOM(consumer, jexlContext,
-                                            jxpathContext, n);
-                                }
-                                continue;
-                            } else if (val instanceof XMLizable) {
-                                ((XMLizable) val).toSAX(new IncludeXMLConsumer(
-                                        consumer));
-                                continue;
-                            }
-                            chars = val != null ? val.toString().toCharArray()
-                                    : ArrayUtils.EMPTY_CHAR_ARRAY;
-                        } catch (Exception e) {
-                            throw new SAXParseException(e.getMessage(), ev
-                                    .getLocation(), e);
-                        } catch (Error err) {
-                            throw new SAXParseException(err.getMessage(), ev
-                                    .getLocation(), new ErrorHolder(err));
-                        }
-                    }
-                    consumer.characters(chars, 0, chars.length);
-                }
-            } else if (ev instanceof EndElement) {
-                EndElement endElement = (EndElement) ev;
-                StartElement startElement = endElement.getStartElement();
-                consumer.endElement(startElement.getNamespaceURI(),
-                        startElement.getLocalName(), startElement.getRaw());
-            } else if (ev instanceof EndPrefixMapping) {
-                EndPrefixMapping endPrefixMapping = (EndPrefixMapping) ev;
-                consumer.endPrefixMapping(endPrefixMapping.getPrefix());
-            } else if (ev instanceof IgnorableWhitespace) {
-                TextEvent text = (TextEvent) ev;
-                characters(jexlContext, jxpathContext, text, new CharHandler() {
-                    public void characters(char[] ch, int offset, int len)
-                            throws SAXException {
-                        consumer.ignorableWhitespace(ch, offset, len);
-                    }
-                });
-            } else if (ev instanceof SkippedEntity) {
-                SkippedEntity skippedEntity = (SkippedEntity) ev;
-                consumer.skippedEntity(skippedEntity.getName());
-            } else if (ev instanceof StartIf) {
-                StartIf startIf = (StartIf) ev;
-                Object val;
-                try {
-                    val = ValueHelper.getValue(startIf.getTest(), jexlContext,
-                            jxpathContext, Boolean.TRUE);
-                } catch (Exception e) {
-                    throw new SAXParseException(e.getMessage(), ev
-                            .getLocation(), e);
-                } catch (Error err) {
-                    throw new SAXParseException(err.getMessage(), ev
-                            .getLocation(), new ErrorHolder(err));
-                }
-                boolean result = false;
-                if (val instanceof Boolean) {
-                    result = ((Boolean) val).booleanValue();
-                } else {
-                    result = (val != null);
-                }
-                if (!result) {
-                    ev = startIf.getEndInstruction().getNext();
-                    continue;
-                }
-            } else if (ev instanceof StartForEach) {
-                StartForEach startForEach = (StartForEach) ev;
-                final Object items = startForEach.getItems();
-                Iterator iter = null;
-                int begin, end, step;
-                String var, varStatus;
-                try {
-                    if (items != null) {
-                        JXTExpression expr = (JXTExpression) items;
-                        if (expr.getCompiledExpression() instanceof CompiledExpression) {
-                            CompiledExpression compiledExpression = (CompiledExpression) expr
-                                    .getCompiledExpression();
-                            Object val = compiledExpression.getPointer(
-                                    jxpathContext, expr.getRaw()).getNode();
-                            // FIXME: workaround for JXPath bug
-                            iter = val instanceof NativeArray ? new JSIntrospector.NativeArrayIterator(
-                                    (NativeArray) val)
-                                    : compiledExpression
-                                            .iteratePointers(jxpathContext);
-                        } else if (expr.getCompiledExpression() instanceof Expression) {
-                            Expression e = (Expression) expr
-                                    .getCompiledExpression();
-                            Object result = e.evaluate(jexlContext);
-                            if (result != null) {
-                                iter = Introspector.getUberspect().getIterator(
-                                        result,
-                                        new Info(
-                                                ev.getLocation().getSystemId(),
-                                                ev.getLocation()
-                                                        .getLineNumber(), ev
-                                                        .getLocation()
-                                                        .getColumnNumber()));
-                            }
-                            if (iter == null) {
-                                iter = EMPTY_ITER;
-                            }
-                        } else {
-                            // literal value
-                            iter = new Iterator() {
-                                Object val = items;
-
-                                public boolean hasNext() {
-                                    return val != null;
-                                }
-
-                                public Object next() {
-                                    Object res = val;
-                                    val = null;
-                                    return res;
-                                }
-
-                                public void remove() {
-                                    // EMPTY
-                                }
-                            };
-                        }
-                    } else {
-                        iter = NULL_ITER;
-                    }
-                    begin = startForEach.getBegin() == null ? 0 : ValueHelper
-                            .getIntValue(startForEach.getBegin(), jexlContext,
-                                    jxpathContext);
-                    end = startForEach.getEnd() == null ? Integer.MAX_VALUE
-                            : ValueHelper.getIntValue(startForEach.getEnd(),
-                                    jexlContext, jxpathContext);
-                    step = startForEach.getStep() == null ? 1 : ValueHelper
-                            .getIntValue(startForEach.getStep(), jexlContext,
-                                    jxpathContext);
-                    var = ValueHelper.getStringValue(startForEach.getVar(),
-                            jexlContext, jxpathContext);
-                    varStatus = ValueHelper.getStringValue(startForEach
-                            .getVarStatus(), jexlContext, jxpathContext);
-                } catch (Exception exc) {
-                    throw new SAXParseException(exc.getMessage(), ev
-                            .getLocation(), exc);
-                } catch (Error err) {
-                    throw new SAXParseException(err.getMessage(), ev
-                            .getLocation(), new ErrorHolder(err));
-                }
-                MyJexlContext localJexlContext = new MyJexlContext(jexlContext);
-                MyVariables localJXPathVariables = new MyVariables(
-                        (MyVariables) jxpathContext.getVariables());
-                int i = 0;
-                // Move to the begin row
-                while (i < begin && iter.hasNext()) {
-                    iter.next();
-                    i++;
-                }
-                LoopTagStatus status = null;
-                if (varStatus != null) {
-                    status = new LoopTagStatus();
-                    status.setBegin(begin);
-                    status.setEnd(end);
-                    status.setStep(step);
-                    status.setFirst(true);
-                    localJexlContext.put(varStatus, status);
-                    localJXPathVariables.declareVariable(varStatus, status);
-                }
-                int skipCounter, count = 1;
-                JXPathContext localJXPathContext = null;
-                while (i <= end && iter.hasNext()) {
-                    Object value = iter.next();
-                    if (value instanceof Pointer) {
-                        Pointer ptr = (Pointer) value;
-                        localJXPathContext = jxpathContext
-                                .getRelativeContext(ptr);
-                        try {
-                            value = ptr.getNode();
-                        } catch (Exception exc) {
-                            throw new SAXParseException(exc.getMessage(), ev
-                                    .getLocation(), null);
-                        }
-                    } else {
-                        localJXPathContext = jxpathContextFactory.newContext(
-                                jxpathContext, value);
-                    }
-                    localJXPathContext.setVariables(localJXPathVariables);
-                    if (var != null) {
-                        localJexlContext.put(var, value);
-                    }
-                    if (status != null) {
-                        status.setIndex(i);
-                        status.setCount(count);
-                        status.setFirst(i == begin);
-                        status.setCurrent(value);
-                        status.setLast((i == end || !iter.hasNext()));
-                    }
-                    execute(consumer, localJexlContext, localJXPathContext,
-                            macroCall, startForEach.getNext(), startForEach
-                                    .getEndInstruction());
-                    // Skip rows
-                    skipCounter = step;
-                    while (--skipCounter > 0 && iter.hasNext()) {
-                        iter.next();
-                    }
-                    // Increase index
-                    i += step;
-                    count++;
-                }
-                ev = startForEach.getEndInstruction().getNext();
-                continue;
-            } else if (ev instanceof StartChoose) {
-                StartChoose startChoose = (StartChoose) ev;
-                StartWhen startWhen = startChoose.getFirstChoice();
-                while (startWhen != null) {
-                    Object val;
-                    try {
-                        val = ValueHelper.getValue(startWhen.getTest(), jexlContext,
-                                jxpathContext, Boolean.TRUE);
-                    } catch (Exception e) {
-                        throw new SAXParseException(e.getMessage(), ev
-                                .getLocation(), e);
-                    }
-                    boolean result;
-                    if (val instanceof Boolean) {
-                        result = ((Boolean) val).booleanValue();
-                    } else {
-                        result = (val != null);
-                    }
-                    if (result) {
-                        execute(consumer, jexlContext, jxpathContext,
-                                macroCall, startWhen.getNext(), startWhen
-                                        .getEndInstruction());
-                        break;
-                    }
-                    startWhen = startWhen.getNextChoice();
-                }
-                if (startWhen == null && startChoose.getOtherwise() != null) {
-                    execute(consumer, jexlContext, jxpathContext, macroCall,
-                            startChoose.getOtherwise().getNext(), startChoose
-                                    .getOtherwise().getEndInstruction());
-                }
-                ev = startChoose.getEndInstruction().getNext();
-                continue;
-            } else if (ev instanceof StartSet) {
-                StartSet startSet = (StartSet) ev;
-                Object value = null;
-                String var = null;
-                try {
-                    if (startSet.getVar() != null) {
-                        var = ValueHelper.getStringValue(startSet.getVar(),
-                                jexlContext, jxpathContext);
-                    }
-                    if (startSet.getValue() != null) {
-                        value = ValueHelper.getNode(startSet.getValue(),
-                                jexlContext, jxpathContext);
-                    }
-                } catch (Exception exc) {
-                    throw new SAXParseException(exc.getMessage(), ev
-                            .getLocation(), exc);
-                }
-                if (value == null) {
-                    NodeList nodeList = toDOMNodeList("set", startSet,
-                            jexlContext, macroCall);
-                    // JXPath doesn't handle NodeList, so convert it to an array
-                    int len = nodeList.getLength();
-                    Node[] nodeArr = new Node[len];
-                    for (int i = 0; i < len; i++) {
-                        nodeArr[i] = nodeList.item(i);
-                    }
-                    value = nodeArr;
-                }
-                if (var != null) {
-                    jxpathContext.getVariables().declareVariable(var, value);
-                    jexlContext.put(var, value);
-                }
-                ev = startSet.getEndInstruction().getNext();
-                continue;
-            } else if (ev instanceof StartElement) {
-                StartElement startElement = (StartElement) ev;
-                StartDefine def = (StartDefine) definitions.get(startElement
-                        .getQname());
-                if (def != null) {
-                    Map attributeMap = new HashMap();
-                    Iterator i = startElement.getAttributeEvents().iterator();
-                    while (i.hasNext()) {
-                        String attributeName;
-                        Object attributeValue;
-                        AttributeEvent attrEvent = (AttributeEvent) i.next();
-                        attributeName = attrEvent.getLocalName();
-                        if (attrEvent instanceof CopyAttribute) {
-                            CopyAttribute copy = (CopyAttribute) attrEvent;
-                            attributeValue = copy.getValue();
-                        } else if (attrEvent instanceof SubstituteAttribute) {
-                            SubstituteAttribute substEvent = (SubstituteAttribute) attrEvent;
-                            if (substEvent.getSubstitutions().size() == 1
-                                    && substEvent.getSubstitutions().get(0) instanceof JXTExpression) {
-                                JXTExpression expr = (JXTExpression) substEvent
-                                        .getSubstitutions().get(0);
-                                Object val;
-                                try {
-                                    val = ValueHelper.getNode(expr,
-                                            jexlContext, jxpathContext);
-                                } catch (Exception e) {
-                                    throw new SAXParseException(e.getMessage(),
-                                            ev.getLocation(), e);
-                                } catch (Error err) {
-                                    throw new SAXParseException(err
-                                            .getMessage(), ev.getLocation(),
-                                            new ErrorHolder(err));
-                                }
-                                attributeValue = val != null ? val : "";
-                            } else {
-                                StringBuffer buf = new StringBuffer();
-                                Iterator iterSubst = substEvent
-                                        .getSubstitutions().iterator();
-                                while (iterSubst.hasNext()) {
-                                    Subst subst = (Subst) iterSubst.next();
-                                    if (subst instanceof Literal) {
-                                        Literal lit = (Literal) subst;
-                                        buf.append(lit.getValue());
-                                    } else if (subst instanceof JXTExpression) {
-                                        JXTExpression expr = (JXTExpression) subst;
-                                        Object val;
-                                        try {
-                                            val = ValueHelper.getValue(expr,
-                                                    jexlContext, jxpathContext);
-                                        } catch (Exception e) {
-                                            throw new SAXParseException(e
-                                                    .getMessage(), ev
-                                                    .getLocation(), e);
-                                        } catch (Error err) {
-                                            throw new SAXParseException(err
-                                                    .getMessage(), ev
-                                                    .getLocation(),
-                                                    new ErrorHolder(err));
-                                        }
-                                        buf.append(val != null ? val.toString()
-                                                : "");
-                                    }
-                                }
-                                attributeValue = buf.toString();
-                            }
-                        } else {
-                            throw new Error("this shouldn't have happened");
-                        }
-                        attributeMap.put(attributeName, attributeValue);
-                    }
-                    MyVariables parent = (MyVariables) jxpathContext
-                            .getVariables();
-                    MyVariables vars = new MyVariables(parent);
-                    MyJexlContext localJexlContext = new MyJexlContext(
-                            jexlContext);
-                    HashMap macro = new HashMap();
-                    macro.put("body", startElement);
-                    macro.put("arguments", attributeMap);
-                    localJexlContext.put("macro", macro);
-                    vars.declareVariable("macro", macro);
-                    Iterator iter = def.getParameters().entrySet().iterator();
-                    while (iter.hasNext()) {
-                        Map.Entry e = (Map.Entry) iter.next();
-                        String key = (String) e.getKey();
-                        StartParameter startParam = (StartParameter) e
-                                .getValue();
-                        Object default_ = startParam.getDefaultValue();
-                        Object val = attributeMap.get(key);
-                        if (val == null) {
-                            val = default_;
-                        }
-                        localJexlContext.put(key, val);
-                        vars.declareVariable(key, val);
-                    }
-                    JXPathContext localJXPathContext = jxpathContextFactory
-                            .newContext(null, jxpathContext.getContextBean());
-                    localJXPathContext.setVariables(vars);
-                    call(ev.getLocation(), startElement, consumer,
-                            localJexlContext, localJXPathContext,
-                            def.getBody(), def.getEndInstruction());
-                    ev = startElement.getEndElement().getNext();
-                    continue;
-                }
-                Iterator i = startElement.getAttributeEvents().iterator();
-                AttributesImpl attrs = new AttributesImpl();
-                while (i.hasNext()) {
-                    AttributeEvent attrEvent = (AttributeEvent) i.next();
-                    if (attrEvent instanceof CopyAttribute) {
-                        CopyAttribute copy = (CopyAttribute) attrEvent;
-                        attrs.addAttribute(copy.getNamespaceURI(), copy
-                                .getLocalName(), copy.getRaw(), copy.getType(),
-                                copy.getValue());
-                    } else if (attrEvent instanceof SubstituteAttribute) {
-                        StringBuffer buf = new StringBuffer();
-                        SubstituteAttribute substEvent = (SubstituteAttribute) attrEvent;
-                        Iterator iterSubst = substEvent.getSubstitutions()
-                                .iterator();
-                        while (iterSubst.hasNext()) {
-                            Subst subst = (Subst) iterSubst.next();
-                            if (subst instanceof Literal) {
-                                Literal lit = (Literal) subst;
-                                buf.append(lit.getValue());
-                            } else if (subst instanceof JXTExpression) {
-                                JXTExpression expr = (JXTExpression) subst;
-                                Object val;
-                                try {
-                                    val = ValueHelper.getValue(expr,
-                                            jexlContext, jxpathContext);
-                                } catch (Exception e) {
-                                    throw new SAXParseException(e.getMessage(),
-                                            ev.getLocation(), e);
-                                } catch (Error err) {
-                                    throw new SAXParseException(err
-                                            .getMessage(), ev.getLocation(),
-                                            new ErrorHolder(err));
-                                }
-                                buf.append(val != null ? val.toString() : "");
-                            }
-                        }
-                        attrs.addAttribute(attrEvent.getNamespaceURI(),
-                                attrEvent.getLocalName(), attrEvent.getRaw(),
-                                attrEvent.getType(), buf.toString());
-                    }
-                }
-                consumer.startElement(startElement.getNamespaceURI(),
-                        startElement.getLocalName(), startElement.getRaw(),
-                        attrs);
-            } else if (ev instanceof StartFormatNumber) {
-                StartFormatNumber startFormatNumber = (StartFormatNumber) ev;
-                try {
-                    String result = startFormatNumber.format(jexlContext,
-                            jxpathContext);
-                    if (result != null) {
-                        char[] chars = result.toCharArray();
-                        consumer.characters(chars, 0, chars.length);
-                    }
-                } catch (Exception e) {
-                    throw new SAXParseException(e.getMessage(), ev
-                            .getLocation(), e);
-                } catch (Error err) {
-                    throw new SAXParseException(err.getMessage(), ev
-                            .getLocation(), new ErrorHolder(err));
-                }
-            } else if (ev instanceof StartFormatDate) {
-                StartFormatDate startFormatDate = (StartFormatDate) ev;
-                try {
-                    String result = startFormatDate.format(jexlContext,
-                            jxpathContext);
-                    if (result != null) {
-                        char[] chars = result.toCharArray();
-                        consumer.characters(chars, 0, chars.length);
-                    }
-                } catch (Exception e) {
-                    throw new SAXParseException(e.getMessage(), ev
-                            .getLocation(), e);
-                } catch (Error err) {
-                    throw new SAXParseException(err.getMessage(), ev
-                            .getLocation(), new ErrorHolder(err));
-                }
-            } else if (ev instanceof StartPrefixMapping) {
-                StartPrefixMapping startPrefixMapping = (StartPrefixMapping) ev;
-                consumer.startPrefixMapping(startPrefixMapping.getPrefix(),
-                        startPrefixMapping.getUri());
-            } else if (ev instanceof StartComment) {
-                StartComment startJXComment = (StartComment) ev;
-                // Parse the body of the comment
-                NodeList nodeList = toDOMNodeList("comment", startJXComment,
-                        jexlContext, macroCall);
-                // JXPath doesn't handle NodeList, so convert it to an array
-                int len = nodeList.getLength();
-                final StringBuffer buf = new StringBuffer();
-                Properties omit = XMLUtils.createPropertiesForXML(true);
-                for (int i = 0; i < len; i++) {
-                    try {
-                        String str = XMLUtils.serializeNode(nodeList.item(i),
-                                omit);
-                        buf.append(StringUtils.substringAfter(str, ">")); // cut
-                        // the
-                        // XML
-                        // header
-                    } catch (ProcessingException e) {
-                        throw new SAXParseException(e.getMessage(),
-                                startJXComment.getLocation(), e);
-                    }
-                }
-                char[] chars = new char[buf.length()];
-                buf.getChars(0, chars.length, chars, 0);
-                consumer.comment(chars, 0, chars.length);
-                ev = startJXComment.getEndInstruction().getNext();
-                continue;
-            } else if (ev instanceof EndCDATA) {
-                consumer.endCDATA();
-            } else if (ev instanceof EndDTD) {
-                consumer.endDTD();
-            } else if (ev instanceof EndEntity) {
-                consumer.endEntity(((EndEntity) ev).getName());
-            } else if (ev instanceof StartCDATA) {
-                consumer.startCDATA();
-            } else if (ev instanceof StartDTD) {
-                StartDTD startDTD = (StartDTD) ev;
-                consumer.startDTD(startDTD.getName(), startDTD.getPublicId(),
-                        startDTD.getSystemId());
-            } else if (ev instanceof StartEntity) {
-                consumer.startEntity(((StartEntity) ev).getName());
-            } else if (ev instanceof StartOut) {
-                StartOut startOut = (StartOut) ev;
-                Object val;
-                try {
-                    val = ValueHelper.getNode(startOut.getCompiledExpression(),
-                            jexlContext, jxpathContext, startOut.getLenient());
-                    if (val instanceof Node) {
-                        executeDOM(consumer, jexlContext, jxpathContext,
-                                (Node) val);
-                    } else if (val instanceof NodeList) {
-                        NodeList nodeList = (NodeList) val;
-                        int len = nodeList.getLength();
-                        for (int i = 0; i < len; i++) {
-                            Node n = nodeList.item(i);
-                            executeDOM(consumer, jexlContext, jxpathContext, n);
-                        }
-                    } else if (val instanceof Node[]) {
-                        Node[] nodeList = (Node[]) val;
-                        int len = nodeList.length;
-                        for (int i = 0; i < len; i++) {
-                            Node n = nodeList[i];
-                            executeDOM(consumer, jexlContext, jxpathContext, n);
-                        }
-                    } else if (val instanceof XMLizable) {
-                        ((XMLizable) val)
-                                .toSAX(new IncludeXMLConsumer(consumer));
-                    } else {
-                        char[] ch = val == null ? ArrayUtils.EMPTY_CHAR_ARRAY
-                                : val.toString().toCharArray();
-                        consumer.characters(ch, 0, ch.length);
-                    }
-                } catch (Exception e) {
-                    throw new SAXParseException(e.getMessage(), ev
-                            .getLocation(), e);
-                }
-            } else if (ev instanceof StartTemplate) {
-                // EMPTY
-            } else if (ev instanceof StartEval) {
-                StartEval startEval = (StartEval) ev;
-                JXTExpression expr = startEval.getValue();
-                try {
-                    Object val = ValueHelper.getNode(expr, jexlContext,
-                            jxpathContext);
-                    if (!(val instanceof StartElement)) {
-                        throw new Exception(
-                                "macro invocation required instead of: " + val);
-                    }
-                    StartElement call = (StartElement) val;
-                    execute(consumer, jexlContext, jxpathContext, call, call
-                            .getNext(), call.getEndElement());
-                } catch (Exception exc) {
-                    throw new SAXParseException(exc.getMessage(), ev
-                            .getLocation(), exc);
-                } catch (Error err) {
-                    throw new SAXParseException(err.getMessage(), ev
-                            .getLocation(), new ErrorHolder(err));
-                }
-                ev = startEval.getEndInstruction().getNext();
-                continue;
-            } else if (ev instanceof StartEvalBody) {
-                StartEvalBody startEval = (StartEvalBody) ev;
-                try {
-                    execute(consumer, jexlContext, jxpathContext, null,
-                            macroCall.getNext(), macroCall.getEndElement());
-                } catch (Exception exc) {
-                    throw new SAXParseException(exc.getMessage(), ev
-                            .getLocation(), exc);
-                } catch (Error err) {
-                    throw new SAXParseException(err.getMessage(), ev
-                            .getLocation(), new ErrorHolder(err));
-                }
-                ev = startEval.getEndInstruction().getNext();
-                continue;
-            } else if (ev instanceof StartDefine) {
-                StartDefine startDefine = (StartDefine) ev;
-                definitions.put(startDefine.getQname(), startDefine);
-                ev = startDefine.getEndInstruction().getNext();
-                continue;
-            } else if (ev instanceof StartImport) {
-                StartImport startImport = (StartImport) ev;
-                String uri;
-                AttributeEvent e = startImport.getUri();
-                if (e instanceof CopyAttribute) {
-                    CopyAttribute copy = (CopyAttribute) e;
-                    uri = copy.getValue();
-                } else {
-                    StringBuffer buf = new StringBuffer();
-                    SubstituteAttribute substAttr = (SubstituteAttribute) e;
-                    Iterator i = substAttr.getSubstitutions().iterator();
-                    while (i.hasNext()) {
-                        Subst subst = (Subst) i.next();
-                        if (subst instanceof Literal) {
-                            Literal lit = (Literal) subst;
-                            buf.append(lit.getValue());
-                        } else if (subst instanceof JXTExpression) {
-                            JXTExpression expr = (JXTExpression) subst;
-                            Object val;
-                            try {
-                                val = ValueHelper.getValue(expr, jexlContext,
-                                        jxpathContext);
-                            } catch (Exception exc) {
-                                throw new SAXParseException(exc.getMessage(),
-                                        ev.getLocation(), exc);
-                            } catch (Error err) {
-                                throw new SAXParseException(err.getMessage(),
-                                        ev.getLocation(), new ErrorHolder(err));
-                            }
-                            buf.append(val != null ? val.toString() : "");
-                        }
-                    }
-                    uri = buf.toString();
-                }
-                Source input = null;
-                StartDocument doc;
-                try {
-                    input = resolver.resolveURI(uri);
-                    SourceValidity validity = null;
-                    synchronized (cache) {
-                        doc = (StartDocument) cache.get(input.getURI());
-                        if (doc != null) {
-                            boolean recompile = false;
-                            if (doc.getCompileTime() == null) {
-                                recompile = true;
-                            } else {
-                                int valid = doc.getCompileTime().isValid();
-                                if (valid == SourceValidity.UNKNOWN) {
-                                    validity = input.getValidity();
-                                    valid = doc.getCompileTime().isValid(
-                                            validity);
-                                }
-                                if (valid != SourceValidity.VALID) {
-                                    recompile = true;
-                                }
-                            }
-                            if (recompile) {
-                                doc = null; // recompile
-                            }
-                        }
-                    }
-                    if (doc == null) {
-                        Parser parser = new Parser();
-                        // call getValidity before using the stream is faster if
-                        // the source is a SitemapSource
-                        if (validity == null) {
-                            validity = input.getValidity();
-                        }
-                        SourceUtil.parse(this.manager, input, parser);
-                        doc = parser.getStartEvent();
-                        doc.setCompileTime(validity);
-                        synchronized (cache) {
-                            cache.put(input.getURI(), doc);
-                        }
-                    }
-                } catch (Exception exc) {
-                    throw new SAXParseException(exc.getMessage(), ev
-                            .getLocation(), exc);
-                } finally {
-                    resolver.release(input);
-                }
-                JXPathContext selectJXPath = jxpathContext;
-                MyJexlContext selectJexl = jexlContext;
-                if (startImport.getSelect() != null) {
-                    try {
-                        Object obj = ValueHelper.getValue(startImport
-                                .getSelect(), jexlContext, jxpathContext);
-                        selectJXPath = jxpathContextFactory.newContext(null,
-                                obj);
-                        selectJXPath.setVariables(variables);
-                        selectJexl = new MyJexlContext(jexlContext);
-                        fillContext(obj, selectJexl);
-                    } catch (Exception exc) {
-                        throw new SAXParseException(exc.getMessage(), ev
-                                .getLocation(), exc);
-                    } catch (Error err) {
-                        throw new SAXParseException(err.getMessage(), ev
-                                .getLocation(), new ErrorHolder(err));
-                    }
-                }
-                try {
-                    execute(consumer, selectJexl, selectJXPath, macroCall, doc
-                            .getNext(), doc.getEndDocument());
-                } catch (Exception exc) {
-                    throw new SAXParseException(
-                            "Exception occurred in imported template " + uri
-                                    + ": " + exc.getMessage(),
-                            ev.getLocation(), exc);
-                }
-                ev = startImport.getEndInstruction().getNext();
-                continue;
-            } else if (ev instanceof StartDocument) {
-                if (((StartDocument) ev).getEndDocument() != null) {
-                    // if this isn't a document fragment
-                    consumer.startDocument();
-                }
-            } else if (ev instanceof EndDocument) {
-                consumer.endDocument();
-            } else if (ev instanceof ProcessingInstruction) {
-                ProcessingInstruction pi = (ProcessingInstruction) ev;
-                consumer.processingInstruction(pi.getTarget(), pi.getData());
-            }
-            ev = ev.getNext();
-        }
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.cocoon.caching.CacheableProcessingComponent#getKey()
-     */
-    public Serializable getKey() {
-        JXTExpression cacheKeyExpr = (JXTExpression) getCurrentTemplateProperty(JXTemplateGenerator.CACHE_KEY);
-        try {
-            final Serializable templateKey = (Serializable) ValueHelper
-                    .getValue(cacheKeyExpr, globalJexlContext, jxpathContext);
-            if (templateKey != null) {
-                return new JXCacheKey(this.inputSource.getURI(), templateKey);
-            }
-        } catch (Exception e) {
-            getLogger().error("error evaluating cache key", e);
-        }
-        return null;
-    }
-
-    /*
-     * (non-Javadoc)
-     * 
-     * @see org.apache.cocoon.caching.CacheableProcessingComponent#getValidity()
-     */
-    public SourceValidity getValidity() {
-        JXTExpression validityExpr = (JXTExpression) getCurrentTemplateProperty(JXTemplateGenerator.VALIDITY);
-        try {
-            final SourceValidity sourceValidity = this.inputSource
-                    .getValidity();
-            final SourceValidity templateValidity = (SourceValidity) ValueHelper
-                    .getValue(validityExpr, globalJexlContext, jxpathContext);
-            if (sourceValidity != null && templateValidity != null) {
-                return new JXSourceValidity(sourceValidity, templateValidity);
-            }
-        } catch (Exception e) {
-            getLogger().error("error evaluating cache validity", e);
-        }
-        return null;
-    }
-
-    private Object getCurrentTemplateProperty(String propertyName) {
-        final String uri = this.inputSource.getURI();
-        StartDocument startEvent;
-        synchronized (cache) {
-            startEvent = (StartDocument) cache.get(uri);
-        }
-        return (startEvent != null) ? startEvent.getTemplateProperties().get(
-                propertyName) : null;
-    }
-
-    private NodeList toDOMNodeList(String elementName, StartInstruction si,
-            MyJexlContext jexlContext, StartElement macroCall)
-            throws SAXException {
-        DOMBuilder builder = new DOMBuilder();
-        builder.startDocument();
-        builder.startElement(NS, elementName, elementName, EMPTY_ATTRS);
-        execute(builder, jexlContext, jxpathContext, macroCall, si.getNext(),
-                si.getEndInstruction());
-        builder.endElement(NS, elementName, elementName);
-        builder.endDocument();
-        Node node = builder.getDocument().getDocumentElement();
-        return node.getChildNodes();
-    }
-
+/*
+ * 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.cocoon.template.jxtg;
+
+import java.beans.PropertyDescriptor;
+import java.io.IOException;
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.caching.CacheableProcessingComponent;
+import org.apache.cocoon.components.flow.FlowHelper;
+import org.apache.cocoon.components.flow.WebContinuation;
+import org.apache.cocoon.components.flow.javascript.fom.FOM_JavaScriptFlowHelper;
+import org.apache.cocoon.components.source.SourceUtil;
+import org.apache.cocoon.environment.ObjectModelHelper;
+import org.apache.cocoon.environment.Request;
+import org.apache.cocoon.environment.SourceResolver;
+import org.apache.cocoon.generation.ServiceableGenerator;
+import org.apache.cocoon.template.jxtg.environment.ErrorHolder;
+import org.apache.cocoon.template.jxtg.environment.JSIntrospector;
+import org.apache.cocoon.template.jxtg.environment.JXCacheKey;
+import org.apache.cocoon.template.jxtg.environment.JXSourceValidity;
+import org.apache.cocoon.template.jxtg.environment.LocatorFacade;
+import org.apache.cocoon.template.jxtg.environment.MyVariables;
+import org.apache.cocoon.template.jxtg.environment.ValueHelper;
+import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+import org.apache.cocoon.template.jxtg.expression.Literal;
+import org.apache.cocoon.template.jxtg.expression.MyJexlContext;
+import org.apache.cocoon.template.jxtg.expression.Subst;
+import org.apache.cocoon.template.jxtg.script.Parser;
+import org.apache.cocoon.template.jxtg.script.event.*;
+import org.apache.cocoon.xml.IncludeXMLConsumer;
+import org.apache.cocoon.xml.XMLConsumer;
+import org.apache.cocoon.xml.XMLUtils;
+import org.apache.cocoon.xml.dom.DOMBuilder;
+import org.apache.cocoon.xml.dom.DOMStreamer;
+import org.apache.commons.jexl.Expression;
+import org.apache.commons.jexl.JexlContext;
+import org.apache.commons.jexl.util.Introspector;
+import org.apache.commons.jexl.util.introspection.Info;
+import org.apache.commons.jxpath.CompiledExpression;
+import org.apache.commons.jxpath.DynamicPropertyHandler;
+import org.apache.commons.jxpath.JXPathBeanInfo;
+import org.apache.commons.jxpath.JXPathContext;
+import org.apache.commons.jxpath.JXPathContextFactory;
+import org.apache.commons.jxpath.JXPathIntrospector;
+import org.apache.commons.jxpath.Pointer;
+import org.apache.commons.jxpath.Variables;
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang.StringUtils;
+import org.apache.excalibur.source.Source;
+import org.apache.excalibur.source.SourceException;
+import org.apache.excalibur.source.SourceValidity;
+import org.apache.excalibur.xml.sax.XMLizable;
+import org.mozilla.javascript.NativeArray;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.helpers.AttributesImpl;
+import org.xml.sax.helpers.LocatorImpl;
+
+/**
+ * @cocoon.sitemap.component.documentation Provides a generic page template with
+ *                                         embedded JSTL and XPath expression
+ *                                         substitution to access data sent by
+ *                                         Cocoon Flowscripts.
+ * 
+ * @cocoon.sitemap.component.name jx
+ * @cocoon.sitemap.component.label content
+ * @cocoon.sitemap.component.logger sitemap.generator.jx
+ * 
+ * @cocoon.sitemap.component.pooling.min 2
+ * @cocoon.sitemap.component.pooling.max 16
+ * @cocoon.sitemap.component.pooling.grow 2
+ * 
+ * 
+ * @version CVS $Id$
+ */
+public class JXTemplateGenerator extends ServiceableGenerator implements
+        CacheableProcessingComponent {
+    /** The namespace used by this generator */
+    public final static String NS = "http://apache.org/cocoon/templates/jx/1.0";
+
+    private static final JXPathContextFactory jxpathContextFactory = JXPathContextFactory
+            .newInstance();
+    private static final Attributes EMPTY_ATTRS = new AttributesImpl();
+
+    private static final Iterator EMPTY_ITER = new Iterator() {
+        public boolean hasNext() {
+            return false;
+        }
+
+        public Object next() {
+            return null;
+        }
+
+        public void remove() {
+            // EMPTY
+        }
+    };
+
+    private static final Iterator NULL_ITER = new Iterator() {
+        public boolean hasNext() {
+            return true;
+        }
+
+        public Object next() {
+            return null;
+        }
+
+        public void remove() {
+            // EMPTY
+        }
+    };
+
+    public static final Locator NULL_LOCATOR = new LocatorImpl();
+
+    public final static String CACHE_KEY = "cache-key";
+    public final static String VALIDITY = "cache-validity";
+
+    private JXPathContext jxpathContext;
+    private MyJexlContext globalJexlContext;
+    private Variables variables;
+    private static Map cache = new HashMap();
+    private Source inputSource;
+    private Map definitions;
+    private Map cocoon;
+
+    static {
+        // Hack: there's no _nice_ way to add my introspector to Jexl right now
+        try {
+            Field field = Introspector.class.getDeclaredField("uberSpect");
+            field.setAccessible(true);
+            field.set(null, new JSIntrospector());
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public XMLConsumer getConsumer() {
+        return this.xmlConsumer;
+    }
+
+    public JXPathContext getJXPathContext() {
+        return jxpathContext;
+    }
+
+    public MyJexlContext getJexlContext() {
+        return globalJexlContext;
+    }
+
+    public void recycle() {
+        if (this.resolver != null) {
+            this.resolver.release(this.inputSource);
+        }
+        this.inputSource = null;
+        this.jxpathContext = null;
+        this.globalJexlContext = null;
+        this.variables = null;
+        this.definitions = null;
+        this.cocoon = null;
+        super.recycle();
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.cocoon.sitemap.SitemapModelComponent#setup(org.apache.cocoon.environment.SourceResolver,
+     *      java.util.Map, java.lang.String,
+     *      org.apache.avalon.framework.parameters.Parameters)
+     */
+    public void setup(SourceResolver resolver, Map objectModel, String src,
+            Parameters parameters) throws ProcessingException, SAXException,
+            IOException {
+
+        super.setup(resolver, objectModel, src, parameters);
+        if (src != null) {
+            try {
+                this.inputSource = resolver.resolveURI(src);
+            } catch (SourceException se) {
+                throw SourceUtil.handle("Error during resolving of '" + src
+                        + "'.", se);
+            }
+            final String uri = inputSource.getURI();
+            boolean regenerate = false;
+            StartDocument startEvent = null;
+            synchronized (cache) {
+                startEvent = (StartDocument) cache.get(uri);
+                if (startEvent != null) {
+                    int valid = SourceValidity.UNKNOWN;
+                    if (startEvent.getCompileTime() != null) {
+                        valid = startEvent.getCompileTime().isValid();
+                    }
+                    if (valid == SourceValidity.UNKNOWN
+                            && startEvent.getCompileTime() != null) {
+                        SourceValidity validity = inputSource.getValidity();
+                        valid = startEvent.getCompileTime().isValid(validity);
+                    }
+                    if (valid != SourceValidity.VALID) {
+                        cache.remove(uri);
+                        regenerate = true;
+                    }
+                } else {
+                    regenerate = true;
+                }
+            }
+            if (regenerate) {
+                Parser parser = new Parser();
+                SourceUtil.parse(this.manager, this.inputSource, parser);
+                startEvent = parser.getStartEvent();
+                startEvent.setCompileTime(this.inputSource.getValidity());
+                synchronized (cache) {
+                    cache.put(uri, startEvent);
+                }
+            }
+        }
+        Object bean = FlowHelper.getContextObject(objectModel);
+        WebContinuation kont = FlowHelper.getWebContinuation(objectModel);
+        setContexts(bean, kont, parameters, objectModel);
+        this.definitions = new HashMap();
+    }
+
+    private void fillContext(Object contextObject, Map map) {
+        if (contextObject != null) {
+            // Hack: I use jxpath to populate the context object's properties
+            // in the jexl context
+            final JXPathBeanInfo bi = JXPathIntrospector
+                    .getBeanInfo(contextObject.getClass());
+            if (bi.isDynamic()) {
+                Class cl = bi.getDynamicPropertyHandlerClass();
+                try {
+                    DynamicPropertyHandler h = (DynamicPropertyHandler) cl
+                            .newInstance();
+                    String[] result = h.getPropertyNames(contextObject);
+                    int len = result.length;
+                    for (int i = 0; i < len; i++) {
+                        try {
+                            map.put(result[i], h.getProperty(contextObject,
+                                    result[i]));
+                        } catch (Exception exc) {
+                            exc.printStackTrace();
+                        }
+                    }
+                } catch (Exception ignored) {
+                    ignored.printStackTrace();
+                }
+            } else {
+                PropertyDescriptor[] props = bi.getPropertyDescriptors();
+                int len = props.length;
+                for (int i = 0; i < len; i++) {
+                    try {
+                        Method read = props[i].getReadMethod();
+                        if (read != null) {
+                            map.put(props[i].getName(), read.invoke(
+                                    contextObject, null));
+                        }
+                    } catch (Exception ignored) {
+                        ignored.printStackTrace();
+                    }
+                }
+            }
+        }
+    }
+
+    private void setContexts(Object contextObject, WebContinuation kont,
+            Parameters parameters, Map objectModel) {
+        final Request request = ObjectModelHelper.getRequest(objectModel);
+        final Object session = request.getSession(false);
+        final Object app = ObjectModelHelper.getContext(objectModel);
+        cocoon = new HashMap();
+        cocoon.put("request", FOM_JavaScriptFlowHelper
+                .getFOM_Request(objectModel));
+        if (session != null) {
+            cocoon.put("session", FOM_JavaScriptFlowHelper
+                    .getFOM_Session(objectModel));
+        }
+        cocoon.put("context", FOM_JavaScriptFlowHelper
+                .getFOM_Context(objectModel));
+        cocoon.put("continuation", FOM_JavaScriptFlowHelper
+                .getFOM_WebContinuation(objectModel));
+        cocoon.put("parameters", Parameters.toProperties(parameters));
+        this.variables = new MyVariables(cocoon, contextObject, kont, request,
+                session, app, parameters);
+        Map map;
+        if (contextObject instanceof Map) {
+            map = (Map) contextObject;
+        } else {
+            map = new HashMap();
+            fillContext(contextObject, map);
+        }
+        jxpathContext = jxpathContextFactory.newContext(null, contextObject);
+        jxpathContext.setVariables(variables);
+        jxpathContext.setLenient(parameters.getParameterAsBoolean(
+                "lenient-xpath", false));
+        globalJexlContext = new MyJexlContext();
+        globalJexlContext.setVars(map);
+        map = globalJexlContext.getVars();
+        map.put("cocoon", cocoon);
+        if (contextObject != null) {
+            map.put("flowContext", contextObject);
+            // FIXME (VG): Is this required (what it's used for - examples)?
+            // Here I use Rhino's live-connect objects to allow Jexl to call
+            // java constructors
+            Object javaPkg = FOM_JavaScriptFlowHelper
+                    .getJavaPackage(objectModel);
+            Object pkgs = FOM_JavaScriptFlowHelper.getPackages(objectModel);
+            map.put("java", javaPkg);
+            map.put("Packages", pkgs);
+        }
+        if (kont != null) {
+            map.put("continuation", kont);
+        }
+        map.put("request", request);
+        map.put("context", app);
+        map.put("parameters", parameters);
+        if (session != null) {
+            map.put("session", session);
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.cocoon.generation.Generator#generate()
+     */
+    public void generate() throws IOException, SAXException,
+            ProcessingException {
+        final String cacheKey = this.inputSource.getURI();
+
+        StartDocument startEvent;
+        synchronized (cache) {
+            startEvent = (StartDocument) cache.get(cacheKey);
+        }
+        performGeneration(this.xmlConsumer, globalJexlContext, jxpathContext,
+                null, startEvent, null);
+    }
+
+    public void performGeneration(final XMLConsumer consumer,
+            MyJexlContext jexlContext, JXPathContext jxpathContext,
+            StartElement macroCall, Event startEvent, Event endEvent)
+            throws SAXException {
+        cocoon.put("consumer", consumer);
+        execute(this.xmlConsumer, globalJexlContext, jxpathContext, null,
+                startEvent, null);
+    }
+
+    interface CharHandler {
+        public void characters(char[] ch, int offset, int length)
+                throws SAXException;
+    }
+
+    private void characters(JexlContext jexlContext,
+            JXPathContext jxpathContext, TextEvent event, CharHandler handler)
+            throws SAXException {
+        Iterator iter = event.getSubstitutions().iterator();
+        while (iter.hasNext()) {
+            Object subst = iter.next();
+            char[] chars;
+            if (subst instanceof char[]) {
+                chars = (char[]) subst;
+            } else {
+                JXTExpression expr = (JXTExpression) subst;
+                try {
+                    Object val = ValueHelper.getValue(expr, jexlContext,
+                            jxpathContext);
+                    chars = val != null ? val.toString().toCharArray()
+                            : ArrayUtils.EMPTY_CHAR_ARRAY;
+                } catch (Exception e) {
+                    throw new SAXParseException(e.getMessage(), event
+                            .getLocation(), e);
+                } catch (Error err) {
+                    throw new SAXParseException(err.getMessage(), event
+                            .getLocation(), new ErrorHolder(err));
+                }
+            }
+            handler.characters(chars, 0, chars.length);
+        }
+    }
+
+    /**
+     * dump a DOM document, using an IncludeXMLConsumer to filter out start/end
+     * document events
+     */
+    private void executeDOM(final XMLConsumer consumer,
+            MyJexlContext jexlContext, JXPathContext jxpathContext, Node node)
+            throws SAXException {
+        IncludeXMLConsumer includer = new IncludeXMLConsumer(consumer);
+        DOMStreamer streamer = new DOMStreamer(includer);
+        streamer.stream(node);
+    }
+
+    private void call(Locator location, StartElement macroCall,
+            final XMLConsumer consumer, MyJexlContext jexlContext,
+            JXPathContext jxpathContext, Event startEvent, Event endEvent)
+            throws SAXException {
+        try {
+            execute(consumer, jexlContext, jxpathContext, macroCall,
+                    startEvent, endEvent);
+        } catch (SAXParseException exc) {
+            throw new SAXParseException(macroCall.getLocalName() + ": "
+                    + exc.getMessage(), location, exc);
+        }
+    }
+
+    private void execute(final XMLConsumer consumer, MyJexlContext jexlContext,
+            JXPathContext jxpathContext, StartElement macroCall,
+            Event startEvent, Event endEvent) throws SAXException {
+        Event ev = startEvent;
+        LocatorFacade loc = new LocatorFacade(ev.getLocation());
+        consumer.setDocumentLocator(loc);
+        while (ev != endEvent) {
+            loc.setDocumentLocator(ev.getLocation());
+            if (ev instanceof Characters) {
+                TextEvent text = (TextEvent) ev;
+                Iterator iter = text.getSubstitutions().iterator();
+                while (iter.hasNext()) {
+                    Object subst = iter.next();
+                    char[] chars;
+                    if (subst instanceof char[]) {
+                        chars = (char[]) subst;
+                    } else {
+                        JXTExpression expr = (JXTExpression) subst;
+                        try {
+                            Object val = ValueHelper.getNode(expr, jexlContext,
+                                    jxpathContext);
+                            if (val instanceof Node) {
+                                executeDOM(consumer, jexlContext,
+                                        jxpathContext, (Node) val);
+                                continue;
+                            } else if (val instanceof NodeList) {
+                                NodeList nodeList = (NodeList) val;
+                                int len = nodeList.getLength();
+                                for (int i = 0; i < len; i++) {
+                                    Node n = nodeList.item(i);
+                                    executeDOM(consumer, jexlContext,
+                                            jxpathContext, n);
+                                }
+                                continue;
+                            } else if (val instanceof Node[]) {
+                                Node[] nodeList = (Node[]) val;
+                                int len = nodeList.length;
+                                for (int i = 0; i < len; i++) {
+                                    Node n = nodeList[i];
+                                    executeDOM(consumer, jexlContext,
+                                            jxpathContext, n);
+                                }
+                                continue;
+                            } else if (val instanceof XMLizable) {
+                                ((XMLizable) val).toSAX(new IncludeXMLConsumer(
+                                        consumer));
+                                continue;
+                            }
+                            chars = val != null ? val.toString().toCharArray()
+                                    : ArrayUtils.EMPTY_CHAR_ARRAY;
+                        } catch (Exception e) {
+                            throw new SAXParseException(e.getMessage(), ev
+                                    .getLocation(), e);
+                        } catch (Error err) {
+                            throw new SAXParseException(err.getMessage(), ev
+                                    .getLocation(), new ErrorHolder(err));
+                        }
+                    }
+                    consumer.characters(chars, 0, chars.length);
+                }
+            } else if (ev instanceof EndElement) {
+                EndElement endElement = (EndElement) ev;
+                StartElement startElement = endElement.getStartElement();
+                consumer.endElement(startElement.getNamespaceURI(),
+                        startElement.getLocalName(), startElement.getRaw());
+            } else if (ev instanceof EndPrefixMapping) {
+                EndPrefixMapping endPrefixMapping = (EndPrefixMapping) ev;
+                consumer.endPrefixMapping(endPrefixMapping.getPrefix());
+            } else if (ev instanceof IgnorableWhitespace) {
+                TextEvent text = (TextEvent) ev;
+                characters(jexlContext, jxpathContext, text, new CharHandler() {
+                    public void characters(char[] ch, int offset, int len)
+                            throws SAXException {
+                        consumer.ignorableWhitespace(ch, offset, len);
+                    }
+                });
+            } else if (ev instanceof SkippedEntity) {
+                SkippedEntity skippedEntity = (SkippedEntity) ev;
+                consumer.skippedEntity(skippedEntity.getName());
+            } else if (ev instanceof StartIf) {
+                StartIf startIf = (StartIf) ev;
+                Object val;
+                try {
+                    val = ValueHelper.getValue(startIf.getTest(), jexlContext,
+                            jxpathContext, Boolean.TRUE);
+                } catch (Exception e) {
+                    throw new SAXParseException(e.getMessage(), ev
+                            .getLocation(), e);
+                } catch (Error err) {
+                    throw new SAXParseException(err.getMessage(), ev
+                            .getLocation(), new ErrorHolder(err));
+                }
+                boolean result = false;
+                if (val instanceof Boolean) {
+                    result = ((Boolean) val).booleanValue();
+                } else {
+                    result = (val != null);
+                }
+                if (!result) {
+                    ev = startIf.getEndInstruction().getNext();
+                    continue;
+                }
+            } else if (ev instanceof StartForEach) {
+                StartForEach startForEach = (StartForEach) ev;
+                final Object items = startForEach.getItems();
+                Iterator iter = null;
+                int begin, end, step;
+                String var, varStatus;
+                try {
+                    if (items != null) {
+                        JXTExpression expr = (JXTExpression) items;
+                        if (expr.getCompiledExpression() instanceof CompiledExpression) {
+                            CompiledExpression compiledExpression = (CompiledExpression) expr
+                                    .getCompiledExpression();
+                            Object val = compiledExpression.getPointer(
+                                    jxpathContext, expr.getRaw()).getNode();
+                            // FIXME: workaround for JXPath bug
+                            iter = val instanceof NativeArray ? new JSIntrospector.NativeArrayIterator(
+                                    (NativeArray) val)
+                                    : compiledExpression
+                                            .iteratePointers(jxpathContext);
+                        } else if (expr.getCompiledExpression() instanceof Expression) {
+                            Expression e = (Expression) expr
+                                    .getCompiledExpression();
+                            Object result = e.evaluate(jexlContext);
+                            if (result != null) {
+                                iter = Introspector.getUberspect().getIterator(
+                                        result,
+                                        new Info(
+                                                ev.getLocation().getSystemId(),
+                                                ev.getLocation()
+                                                        .getLineNumber(), ev
+                                                        .getLocation()
+                                                        .getColumnNumber()));
+                            }
+                            if (iter == null) {
+                                iter = EMPTY_ITER;
+                            }
+                        } else {
+                            // literal value
+                            iter = new Iterator() {
+                                Object val = items;
+
+                                public boolean hasNext() {
+                                    return val != null;
+                                }
+
+                                public Object next() {
+                                    Object res = val;
+                                    val = null;
+                                    return res;
+                                }
+
+                                public void remove() {
+                                    // EMPTY
+                                }
+                            };
+                        }
+                    } else {
+                        iter = NULL_ITER;
+                    }
+                    begin = startForEach.getBegin() == null ? 0 : ValueHelper
+                            .getIntValue(startForEach.getBegin(), jexlContext,
+                                    jxpathContext);
+                    end = startForEach.getEnd() == null ? Integer.MAX_VALUE
+                            : ValueHelper.getIntValue(startForEach.getEnd(),
+                                    jexlContext, jxpathContext);
+                    step = startForEach.getStep() == null ? 1 : ValueHelper
+                            .getIntValue(startForEach.getStep(), jexlContext,
+                                    jxpathContext);
+                    var = ValueHelper.getStringValue(startForEach.getVar(),
+                            jexlContext, jxpathContext);
+                    varStatus = ValueHelper.getStringValue(startForEach
+                            .getVarStatus(), jexlContext, jxpathContext);
+                } catch (Exception exc) {
+                    throw new SAXParseException(exc.getMessage(), ev
+                            .getLocation(), exc);
+                } catch (Error err) {
+                    throw new SAXParseException(err.getMessage(), ev
+                            .getLocation(), new ErrorHolder(err));
+                }
+                MyJexlContext localJexlContext = new MyJexlContext(jexlContext);
+                MyVariables localJXPathVariables = new MyVariables(
+                        (MyVariables) jxpathContext.getVariables());
+                int i = 0;
+                // Move to the begin row
+                while (i < begin && iter.hasNext()) {
+                    iter.next();
+                    i++;
+                }
+                LoopTagStatus status = null;
+                if (varStatus != null) {
+                    status = new LoopTagStatus();
+                    status.setBegin(begin);
+                    status.setEnd(end);
+                    status.setStep(step);
+                    status.setFirst(true);
+                    localJexlContext.put(varStatus, status);
+                    localJXPathVariables.declareVariable(varStatus, status);
+                }
+                int skipCounter, count = 1;
+                JXPathContext localJXPathContext = null;
+                while (i <= end && iter.hasNext()) {
+                    Object value = iter.next();
+                    if (value instanceof Pointer) {
+                        Pointer ptr = (Pointer) value;
+                        localJXPathContext = jxpathContext
+                                .getRelativeContext(ptr);
+                        try {
+                            value = ptr.getNode();
+                        } catch (Exception exc) {
+                            throw new SAXParseException(exc.getMessage(), ev
+                                    .getLocation(), null);
+                        }
+                    } else {
+                        localJXPathContext = jxpathContextFactory.newContext(
+                                jxpathContext, value);
+                    }
+                    localJXPathContext.setVariables(localJXPathVariables);
+                    if (var != null) {
+                        localJexlContext.put(var, value);
+                    }
+                    if (status != null) {
+                        status.setIndex(i);
+                        status.setCount(count);
+                        status.setFirst(i == begin);
+                        status.setCurrent(value);
+                        status.setLast((i == end || !iter.hasNext()));
+                    }
+                    execute(consumer, localJexlContext, localJXPathContext,
+                            macroCall, startForEach.getNext(), startForEach
+                                    .getEndInstruction());
+                    // Skip rows
+                    skipCounter = step;
+                    while (--skipCounter > 0 && iter.hasNext()) {
+                        iter.next();
+                    }
+                    // Increase index
+                    i += step;
+                    count++;
+                }
+                ev = startForEach.getEndInstruction().getNext();
+                continue;
+            } else if (ev instanceof StartChoose) {
+                StartChoose startChoose = (StartChoose) ev;
+                StartWhen startWhen = startChoose.getFirstChoice();
+                while (startWhen != null) {
+                    Object val;
+                    try {
+                        val = ValueHelper.getValue(startWhen.getTest(), jexlContext,
+                                jxpathContext, Boolean.TRUE);
+                    } catch (Exception e) {
+                        throw new SAXParseException(e.getMessage(), ev
+                                .getLocation(), e);
+                    }
+                    boolean result;
+                    if (val instanceof Boolean) {
+                        result = ((Boolean) val).booleanValue();
+                    } else {
+                        result = (val != null);
+                    }
+                    if (result) {
+                        execute(consumer, jexlContext, jxpathContext,
+                                macroCall, startWhen.getNext(), startWhen
+                                        .getEndInstruction());
+                        break;
+                    }
+                    startWhen = startWhen.getNextChoice();
+                }
+                if (startWhen == null && startChoose.getOtherwise() != null) {
+                    execute(consumer, jexlContext, jxpathContext, macroCall,
+                            startChoose.getOtherwise().getNext(), startChoose
+                                    .getOtherwise().getEndInstruction());
+                }
+                ev = startChoose.getEndInstruction().getNext();
+                continue;
+            } else if (ev instanceof StartSet) {
+                StartSet startSet = (StartSet) ev;
+                Object value = null;
+                String var = null;
+                try {
+                    if (startSet.getVar() != null) {
+                        var = ValueHelper.getStringValue(startSet.getVar(),
+                                jexlContext, jxpathContext);
+                    }
+                    if (startSet.getValue() != null) {
+                        value = ValueHelper.getNode(startSet.getValue(),
+                                jexlContext, jxpathContext);
+                    }
+                } catch (Exception exc) {
+                    throw new SAXParseException(exc.getMessage(), ev
+                            .getLocation(), exc);
+                }
+                if (value == null) {
+                    NodeList nodeList = toDOMNodeList("set", startSet,
+                            jexlContext, macroCall);
+                    // JXPath doesn't handle NodeList, so convert it to an array
+                    int len = nodeList.getLength();
+                    Node[] nodeArr = new Node[len];
+                    for (int i = 0; i < len; i++) {
+                        nodeArr[i] = nodeList.item(i);
+                    }
+                    value = nodeArr;
+                }
+                if (var != null) {
+                    jxpathContext.getVariables().declareVariable(var, value);
+                    jexlContext.put(var, value);
+                }
+                ev = startSet.getEndInstruction().getNext();
+                continue;
+            } else if (ev instanceof StartElement) {
+                StartElement startElement = (StartElement) ev;
+                StartDefine def = (StartDefine) definitions.get(startElement
+                        .getQname());
+                if (def != null) {
+                    Map attributeMap = new HashMap();
+                    Iterator i = startElement.getAttributeEvents().iterator();
+                    while (i.hasNext()) {
+                        String attributeName;
+                        Object attributeValue;
+                        AttributeEvent attrEvent = (AttributeEvent) i.next();
+                        attributeName = attrEvent.getLocalName();
+                        if (attrEvent instanceof CopyAttribute) {
+                            CopyAttribute copy = (CopyAttribute) attrEvent;
+                            attributeValue = copy.getValue();
+                        } else if (attrEvent instanceof SubstituteAttribute) {
+                            SubstituteAttribute substEvent = (SubstituteAttribute) attrEvent;
+                            if (substEvent.getSubstitutions().size() == 1
+                                    && substEvent.getSubstitutions().get(0) instanceof JXTExpression) {
+                                JXTExpression expr = (JXTExpression) substEvent
+                                        .getSubstitutions().get(0);
+                                Object val;
+                                try {
+                                    val = ValueHelper.getNode(expr,
+                                            jexlContext, jxpathContext);
+                                } catch (Exception e) {
+                                    throw new SAXParseException(e.getMessage(),
+                                            ev.getLocation(), e);
+                                } catch (Error err) {
+                                    throw new SAXParseException(err
+                                            .getMessage(), ev.getLocation(),
+                                            new ErrorHolder(err));
+                                }
+                                attributeValue = val != null ? val : "";
+                            } else {
+                                StringBuffer buf = new StringBuffer();
+                                Iterator iterSubst = substEvent
+                                        .getSubstitutions().iterator();
+                                while (iterSubst.hasNext()) {
+                                    Subst subst = (Subst) iterSubst.next();
+                                    if (subst instanceof Literal) {
+                                        Literal lit = (Literal) subst;
+                                        buf.append(lit.getValue());
+                                    } else if (subst instanceof JXTExpression) {
+                                        JXTExpression expr = (JXTExpression) subst;
+                                        Object val;
+                                        try {
+                                            val = ValueHelper.getValue(expr,
+                                                    jexlContext, jxpathContext);
+                                        } catch (Exception e) {
+                                            throw new SAXParseException(e
+                                                    .getMessage(), ev
+                                                    .getLocation(), e);
+                                        } catch (Error err) {
+                                            throw new SAXParseException(err
+                                                    .getMessage(), ev
+                                                    .getLocation(),
+                                                    new ErrorHolder(err));
+                                        }
+                                        buf.append(val != null ? val.toString()
+                                                : "");
+                                    }
+                                }
+                                attributeValue = buf.toString();
+                            }
+                        } else {
+                            throw new Error("this shouldn't have happened");
+                        }
+                        attributeMap.put(attributeName, attributeValue);
+                    }
+                    MyVariables parent = (MyVariables) jxpathContext
+                            .getVariables();
+                    MyVariables vars = new MyVariables(parent);
+                    MyJexlContext localJexlContext = new MyJexlContext(
+                            jexlContext);
+                    HashMap macro = new HashMap();
+                    macro.put("body", startElement);
+                    macro.put("arguments", attributeMap);
+                    localJexlContext.put("macro", macro);
+                    vars.declareVariable("macro", macro);
+                    Iterator iter = def.getParameters().entrySet().iterator();
+                    while (iter.hasNext()) {
+                        Map.Entry e = (Map.Entry) iter.next();
+                        String key = (String) e.getKey();
+                        StartParameter startParam = (StartParameter) e
+                                .getValue();
+                        Object default_ = startParam.getDefaultValue();
+                        Object val = attributeMap.get(key);
+                        if (val == null) {
+                            val = default_;
+                        }
+                        localJexlContext.put(key, val);
+                        vars.declareVariable(key, val);
+                    }
+                    JXPathContext localJXPathContext = jxpathContextFactory
+                            .newContext(null, jxpathContext.getContextBean());
+                    localJXPathContext.setVariables(vars);
+                    call(ev.getLocation(), startElement, consumer,
+                            localJexlContext, localJXPathContext,
+                            def.getBody(), def.getEndInstruction());
+                    ev = startElement.getEndElement().getNext();
+                    continue;
+                }
+                Iterator i = startElement.getAttributeEvents().iterator();
+                AttributesImpl attrs = new AttributesImpl();
+                while (i.hasNext()) {
+                    AttributeEvent attrEvent = (AttributeEvent) i.next();
+                    if (attrEvent instanceof CopyAttribute) {
+                        CopyAttribute copy = (CopyAttribute) attrEvent;
+                        attrs.addAttribute(copy.getNamespaceURI(), copy
+                                .getLocalName(), copy.getRaw(), copy.getType(),
+                                copy.getValue());
+                    } else if (attrEvent instanceof SubstituteAttribute) {
+                        StringBuffer buf = new StringBuffer();
+                        SubstituteAttribute substEvent = (SubstituteAttribute) attrEvent;
+                        Iterator iterSubst = substEvent.getSubstitutions()
+                                .iterator();
+                        while (iterSubst.hasNext()) {
+                            Subst subst = (Subst) iterSubst.next();
+                            if (subst instanceof Literal) {
+                                Literal lit = (Literal) subst;
+                                buf.append(lit.getValue());
+                            } else if (subst instanceof JXTExpression) {
+                                JXTExpression expr = (JXTExpression) subst;
+                                Object val;
+                                try {
+                                    val = ValueHelper.getValue(expr,
+                                            jexlContext, jxpathContext);
+                                } catch (Exception e) {
+                                    throw new SAXParseException(e.getMessage(),
+                                            ev.getLocation(), e);
+                                } catch (Error err) {
+                                    throw new SAXParseException(err
+                                            .getMessage(), ev.getLocation(),
+                                            new ErrorHolder(err));
+                                }
+                                buf.append(val != null ? val.toString() : "");
+                            }
+                        }
+                        attrs.addAttribute(attrEvent.getNamespaceURI(),
+                                attrEvent.getLocalName(), attrEvent.getRaw(),
+                                attrEvent.getType(), buf.toString());
+                    }
+                }
+                consumer.startElement(startElement.getNamespaceURI(),
+                        startElement.getLocalName(), startElement.getRaw(),
+                        attrs);
+            } else if (ev instanceof StartFormatNumber) {
+                StartFormatNumber startFormatNumber = (StartFormatNumber) ev;
+                try {
+                    String result = startFormatNumber.format(jexlContext,
+                            jxpathContext);
+                    if (result != null) {
+                        char[] chars = result.toCharArray();
+                        consumer.characters(chars, 0, chars.length);
+                    }
+                } catch (Exception e) {
+                    throw new SAXParseException(e.getMessage(), ev
+                            .getLocation(), e);
+                } catch (Error err) {
+                    throw new SAXParseException(err.getMessage(), ev
+                            .getLocation(), new ErrorHolder(err));
+                }
+            } else if (ev instanceof StartFormatDate) {
+                StartFormatDate startFormatDate = (StartFormatDate) ev;
+                try {
+                    String result = startFormatDate.format(jexlContext,
+                            jxpathContext);
+                    if (result != null) {
+                        char[] chars = result.toCharArray();
+                        consumer.characters(chars, 0, chars.length);
+                    }
+                } catch (Exception e) {
+                    throw new SAXParseException(e.getMessage(), ev
+                            .getLocation(), e);
+                } catch (Error err) {
+                    throw new SAXParseException(err.getMessage(), ev
+                            .getLocation(), new ErrorHolder(err));
+                }
+            } else if (ev instanceof StartPrefixMapping) {
+                StartPrefixMapping startPrefixMapping = (StartPrefixMapping) ev;
+                consumer.startPrefixMapping(startPrefixMapping.getPrefix(),
+                        startPrefixMapping.getUri());
+            } else if (ev instanceof StartComment) {
+                StartComment startJXComment = (StartComment) ev;
+                // Parse the body of the comment
+                NodeList nodeList = toDOMNodeList("comment", startJXComment,
+                        jexlContext, macroCall);
+                // JXPath doesn't handle NodeList, so convert it to an array
+                int len = nodeList.getLength();
+                final StringBuffer buf = new StringBuffer();
+                Properties omit = XMLUtils.createPropertiesForXML(true);
+                for (int i = 0; i < len; i++) {
+                    try {
+                        String str = XMLUtils.serializeNode(nodeList.item(i),
+                                omit);
+                        buf.append(StringUtils.substringAfter(str, ">")); // cut
+                        // the
+                        // XML
+                        // header
+                    } catch (ProcessingException e) {
+                        throw new SAXParseException(e.getMessage(),
+                                startJXComment.getLocation(), e);
+                    }
+                }
+                char[] chars = new char[buf.length()];
+                buf.getChars(0, chars.length, chars, 0);
+                consumer.comment(chars, 0, chars.length);
+                ev = startJXComment.getEndInstruction().getNext();
+                continue;
+            } else if (ev instanceof EndCDATA) {
+                consumer.endCDATA();
+            } else if (ev instanceof EndDTD) {
+                consumer.endDTD();
+            } else if (ev instanceof EndEntity) {
+                consumer.endEntity(((EndEntity) ev).getName());
+            } else if (ev instanceof StartCDATA) {
+                consumer.startCDATA();
+            } else if (ev instanceof StartDTD) {
+                StartDTD startDTD = (StartDTD) ev;
+                consumer.startDTD(startDTD.getName(), startDTD.getPublicId(),
+                        startDTD.getSystemId());
+            } else if (ev instanceof StartEntity) {
+                consumer.startEntity(((StartEntity) ev).getName());
+            } else if (ev instanceof StartOut) {
+                StartOut startOut = (StartOut) ev;
+                Object val;
+                try {
+                    val = ValueHelper.getNode(startOut.getCompiledExpression(),
+                            jexlContext, jxpathContext, startOut.getLenient());
+                    if (val instanceof Node) {
+                        executeDOM(consumer, jexlContext, jxpathContext,
+                                (Node) val);
+                    } else if (val instanceof NodeList) {
+                        NodeList nodeList = (NodeList) val;
+                        int len = nodeList.getLength();
+                        for (int i = 0; i < len; i++) {
+                            Node n = nodeList.item(i);
+                            executeDOM(consumer, jexlContext, jxpathContext, n);
+                        }
+                    } else if (val instanceof Node[]) {
+                        Node[] nodeList = (Node[]) val;
+                        int len = nodeList.length;
+                        for (int i = 0; i < len; i++) {
+                            Node n = nodeList[i];
+                            executeDOM(consumer, jexlContext, jxpathContext, n);
+                        }
+                    } else if (val instanceof XMLizable) {
+                        ((XMLizable) val)
+                                .toSAX(new IncludeXMLConsumer(consumer));
+                    } else {
+                        char[] ch = val == null ? ArrayUtils.EMPTY_CHAR_ARRAY
+                                : val.toString().toCharArray();
+                        consumer.characters(ch, 0, ch.length);
+                    }
+                } catch (Exception e) {
+                    throw new SAXParseException(e.getMessage(), ev
+                            .getLocation(), e);
+                }
+            } else if (ev instanceof StartTemplate) {
+                // EMPTY
+            } else if (ev instanceof StartEval) {
+                StartEval startEval = (StartEval) ev;
+                JXTExpression expr = startEval.getValue();
+                try {
+                    Object val = ValueHelper.getNode(expr, jexlContext,
+                            jxpathContext);
+                    if (!(val instanceof StartElement)) {
+                        throw new Exception(
+                                "macro invocation required instead of: " + val);
+                    }
+                    StartElement call = (StartElement) val;
+                    execute(consumer, jexlContext, jxpathContext, call, call
+                            .getNext(), call.getEndElement());
+                } catch (Exception exc) {
+                    throw new SAXParseException(exc.getMessage(), ev
+                            .getLocation(), exc);
+                } catch (Error err) {
+                    throw new SAXParseException(err.getMessage(), ev
+                            .getLocation(), new ErrorHolder(err));
+                }
+                ev = startEval.getEndInstruction().getNext();
+                continue;
+            } else if (ev instanceof StartEvalBody) {
+                StartEvalBody startEval = (StartEvalBody) ev;
+                try {
+                    execute(consumer, jexlContext, jxpathContext, null,
+                            macroCall.getNext(), macroCall.getEndElement());
+                } catch (Exception exc) {
+                    throw new SAXParseException(exc.getMessage(), ev
+                            .getLocation(), exc);
+                } catch (Error err) {
+                    throw new SAXParseException(err.getMessage(), ev
+                            .getLocation(), new ErrorHolder(err));
+                }
+                ev = startEval.getEndInstruction().getNext();
+                continue;
+            } else if (ev instanceof StartDefine) {
+                StartDefine startDefine = (StartDefine) ev;
+                definitions.put(startDefine.getQname(), startDefine);
+                ev = startDefine.getEndInstruction().getNext();
+                continue;
+            } else if (ev instanceof StartImport) {
+                StartImport startImport = (StartImport) ev;
+                String uri;
+                AttributeEvent e = startImport.getUri();
+                if (e instanceof CopyAttribute) {
+                    CopyAttribute copy = (CopyAttribute) e;
+                    uri = copy.getValue();
+                } else {
+                    StringBuffer buf = new StringBuffer();
+                    SubstituteAttribute substAttr = (SubstituteAttribute) e;
+                    Iterator i = substAttr.getSubstitutions().iterator();
+                    while (i.hasNext()) {
+                        Subst subst = (Subst) i.next();
+                        if (subst instanceof Literal) {
+                            Literal lit = (Literal) subst;
+                            buf.append(lit.getValue());
+                        } else if (subst instanceof JXTExpression) {
+                            JXTExpression expr = (JXTExpression) subst;
+                            Object val;
+                            try {
+                                val = ValueHelper.getValue(expr, jexlContext,
+                                        jxpathContext);
+                            } catch (Exception exc) {
+                                throw new SAXParseException(exc.getMessage(),
+                                        ev.getLocation(), exc);
+                            } catch (Error err) {
+                                throw new SAXParseException(err.getMessage(),
+                                        ev.getLocation(), new ErrorHolder(err));
+                            }
+                            buf.append(val != null ? val.toString() : "");
+                        }
+                    }
+                    uri = buf.toString();
+                }
+                Source input = null;
+                StartDocument doc;
+                try {
+                    input = resolver.resolveURI(uri);
+                    SourceValidity validity = null;
+                    synchronized (cache) {
+                        doc = (StartDocument) cache.get(input.getURI());
+                        if (doc != null) {
+                            boolean recompile = false;
+                            if (doc.getCompileTime() == null) {
+                                recompile = true;
+                            } else {
+                                int valid = doc.getCompileTime().isValid();
+                                if (valid == SourceValidity.UNKNOWN) {
+                                    validity = input.getValidity();
+                                    valid = doc.getCompileTime().isValid(
+                                            validity);
+                                }
+                                if (valid != SourceValidity.VALID) {
+                                    recompile = true;
+                                }
+                            }
+                            if (recompile) {
+                                doc = null; // recompile
+                            }
+                        }
+                    }
+                    if (doc == null) {
+                        Parser parser = new Parser();
+                        // call getValidity before using the stream is faster if
+                        // the source is a SitemapSource
+                        if (validity == null) {
+                            validity = input.getValidity();
+                        }
+                        SourceUtil.parse(this.manager, input, parser);
+                        doc = parser.getStartEvent();
+                        doc.setCompileTime(validity);
+                        synchronized (cache) {
+                            cache.put(input.getURI(), doc);
+                        }
+                    }
+                } catch (Exception exc) {
+                    throw new SAXParseException(exc.getMessage(), ev
+                            .getLocation(), exc);
+                } finally {
+                    resolver.release(input);
+                }
+                JXPathContext selectJXPath = jxpathContext;
+                MyJexlContext selectJexl = jexlContext;
+                if (startImport.getSelect() != null) {
+                    try {
+                        Object obj = ValueHelper.getValue(startImport
+                                .getSelect(), jexlContext, jxpathContext);
+                        selectJXPath = jxpathContextFactory.newContext(null,
+                                obj);
+                        selectJXPath.setVariables(variables);
+                        selectJexl = new MyJexlContext(jexlContext);
+                        fillContext(obj, selectJexl);
+                    } catch (Exception exc) {
+                        throw new SAXParseException(exc.getMessage(), ev
+                                .getLocation(), exc);
+                    } catch (Error err) {
+                        throw new SAXParseException(err.getMessage(), ev
+                                .getLocation(), new ErrorHolder(err));
+                    }
+                }
+                try {
+                    execute(consumer, selectJexl, selectJXPath, macroCall, doc
+                            .getNext(), doc.getEndDocument());
+                } catch (Exception exc) {
+                    throw new SAXParseException(
+                            "Exception occurred in imported template " + uri
+                                    + ": " + exc.getMessage(),
+                            ev.getLocation(), exc);
+                }
+                ev = startImport.getEndInstruction().getNext();
+                continue;
+            } else if (ev instanceof StartDocument) {
+                if (((StartDocument) ev).getEndDocument() != null) {
+                    // if this isn't a document fragment
+                    consumer.startDocument();
+                }
+            } else if (ev instanceof EndDocument) {
+                consumer.endDocument();
+            } else if (ev instanceof ProcessingInstruction) {
+                ProcessingInstruction pi = (ProcessingInstruction) ev;
+                consumer.processingInstruction(pi.getTarget(), pi.getData());
+            }
+            ev = ev.getNext();
+        }
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.cocoon.caching.CacheableProcessingComponent#getKey()
+     */
+    public Serializable getKey() {
+        JXTExpression cacheKeyExpr = (JXTExpression) getCurrentTemplateProperty(JXTemplateGenerator.CACHE_KEY);
+        try {
+            final Serializable templateKey = (Serializable) ValueHelper
+                    .getValue(cacheKeyExpr, globalJexlContext, jxpathContext);
+            if (templateKey != null) {
+                return new JXCacheKey(this.inputSource.getURI(), templateKey);
+            }
+        } catch (Exception e) {
+            getLogger().error("error evaluating cache key", e);
+        }
+        return null;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.apache.cocoon.caching.CacheableProcessingComponent#getValidity()
+     */
+    public SourceValidity getValidity() {
+        JXTExpression validityExpr = (JXTExpression) getCurrentTemplateProperty(JXTemplateGenerator.VALIDITY);
+        try {
+            final SourceValidity sourceValidity = this.inputSource
+                    .getValidity();
+            final SourceValidity templateValidity = (SourceValidity) ValueHelper
+                    .getValue(validityExpr, globalJexlContext, jxpathContext);
+            if (sourceValidity != null && templateValidity != null) {
+                return new JXSourceValidity(sourceValidity, templateValidity);
+            }
+        } catch (Exception e) {
+            getLogger().error("error evaluating cache validity", e);
+        }
+        return null;
+    }
+
+    private Object getCurrentTemplateProperty(String propertyName) {
+        final String uri = this.inputSource.getURI();
+        StartDocument startEvent;
+        synchronized (cache) {
+            startEvent = (StartDocument) cache.get(uri);
+        }
+        return (startEvent != null) ? startEvent.getTemplateProperties().get(
+                propertyName) : null;
+    }
+
+    private NodeList toDOMNodeList(String elementName, StartInstruction si,
+            MyJexlContext jexlContext, StartElement macroCall)
+            throws SAXException {
+        DOMBuilder builder = new DOMBuilder();
+        builder.startDocument();
+        builder.startElement(NS, elementName, elementName, EMPTY_ATTRS);
+        execute(builder, jexlContext, jxpathContext, macroCall, si.getNext(),
+                si.getEndInstruction());
+        builder.endElement(NS, elementName, elementName);
+        builder.endDocument();
+        Node node = builder.getDocument().getDocumentElement();
+        return node.getChildNodes();
+    }
+
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/TransformerAdapter.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/TransformerAdapter.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/TransformerAdapter.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/TransformerAdapter.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/TransformerAdapter.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/TransformerAdapter.java	Thu Dec  9 07:41:02 2004
@@ -1,94 +1,94 @@
-/*
- * 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.cocoon.template.jxtg;
-
-import java.io.IOException;
-import java.util.Map;
-
-import org.apache.avalon.framework.parameters.Parameters;
-import org.apache.avalon.framework.service.ServiceException;
-import org.apache.avalon.framework.service.ServiceManager;
-import org.apache.cocoon.ProcessingException;
-import org.apache.cocoon.environment.SourceResolver;
-import org.apache.cocoon.template.jxtg.script.Parser;
-import org.apache.cocoon.transformation.ServiceableTransformer;
-import org.apache.cocoon.xml.XMLConsumer;
-import org.xml.sax.SAXException;
-
-
-/**
- * Adapter that makes this generator usable as a transformer
- * (Note there is a performance penalty for this however:
- * you effectively recompile the template for every instance document)
- */
-public class TransformerAdapter extends ServiceableTransformer {
-    static class TemplateConsumer extends Parser implements XMLConsumer {
-
-        public TemplateConsumer() {
-            this.gen = new JXTemplateGenerator();
-        }
-
-        public void setup(SourceResolver resolver, Map objectModel, String src, Parameters parameters) 
-            throws ProcessingException, SAXException, IOException {
-            this.gen.setup(resolver, objectModel, null, parameters);
-        }
-
-        public void service(ServiceManager manager) 
-            throws ServiceException {
-            this.gen.service(manager);
-        }
-
-        public void endDocument() throws SAXException {
-            super.endDocument();
-            gen.performGeneration(gen.getConsumer(), gen.getJexlContext(), gen.getJXPathContext(), null, getStartEvent(), null);
-        }
-
-        void setConsumer(XMLConsumer consumer) {
-            gen.setConsumer(consumer);
-        }
-
-        protected void recycle() {
-            super.recycle();
-            gen.recycle();
-        }
-
-        JXTemplateGenerator gen;
-    }
-
-    TemplateConsumer templateConsumer = new TemplateConsumer();
-
-    public void recycle() {
-        super.recycle();
-        templateConsumer.recycle();
-    }
-
-    public void setup(SourceResolver resolver, Map objectModel, String src, Parameters parameters)
-        throws ProcessingException, SAXException, IOException {
-        super.setup(resolver, objectModel, src, parameters);
-        templateConsumer.setup(resolver, objectModel, src, parameters);
-    }
-
-    public void service(ServiceManager manager) 
-        throws ServiceException {
-        super.service(manager);
-        templateConsumer.service(manager);
-    }
-
-    public void setConsumer(XMLConsumer xmlConsumer) {
-        super.setConsumer(templateConsumer);
-        templateConsumer.setConsumer(xmlConsumer);
-    }
+/*
+ * 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.cocoon.template.jxtg;
+
+import java.io.IOException;
+import java.util.Map;
+
+import org.apache.avalon.framework.parameters.Parameters;
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.environment.SourceResolver;
+import org.apache.cocoon.template.jxtg.script.Parser;
+import org.apache.cocoon.transformation.ServiceableTransformer;
+import org.apache.cocoon.xml.XMLConsumer;
+import org.xml.sax.SAXException;
+
+
+/**
+ * Adapter that makes this generator usable as a transformer
+ * (Note there is a performance penalty for this however:
+ * you effectively recompile the template for every instance document)
+ */
+public class TransformerAdapter extends ServiceableTransformer {
+    static class TemplateConsumer extends Parser implements XMLConsumer {
+
+        public TemplateConsumer() {
+            this.gen = new JXTemplateGenerator();
+        }
+
+        public void setup(SourceResolver resolver, Map objectModel, String src, Parameters parameters) 
+            throws ProcessingException, SAXException, IOException {
+            this.gen.setup(resolver, objectModel, null, parameters);
+        }
+
+        public void service(ServiceManager manager) 
+            throws ServiceException {
+            this.gen.service(manager);
+        }
+
+        public void endDocument() throws SAXException {
+            super.endDocument();
+            gen.performGeneration(gen.getConsumer(), gen.getJexlContext(), gen.getJXPathContext(), null, getStartEvent(), null);
+        }
+
+        void setConsumer(XMLConsumer consumer) {
+            gen.setConsumer(consumer);
+        }
+
+        protected void recycle() {
+            super.recycle();
+            gen.recycle();
+        }
+
+        JXTemplateGenerator gen;
+    }
+
+    TemplateConsumer templateConsumer = new TemplateConsumer();
+
+    public void recycle() {
+        super.recycle();
+        templateConsumer.recycle();
+    }
+
+    public void setup(SourceResolver resolver, Map objectModel, String src, Parameters parameters)
+        throws ProcessingException, SAXException, IOException {
+        super.setup(resolver, objectModel, src, parameters);
+        templateConsumer.setup(resolver, objectModel, src, parameters);
+    }
+
+    public void service(ServiceManager manager) 
+        throws ServiceException {
+        super.service(manager);
+        templateConsumer.service(manager);
+    }
+
+    public void setConsumer(XMLConsumer xmlConsumer) {
+        super.setConsumer(templateConsumer);
+        templateConsumer.setConsumer(xmlConsumer);
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/ErrorHolder.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/ErrorHolder.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/ErrorHolder.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/ErrorHolder.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/ErrorHolder.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/ErrorHolder.java	Thu Dec  9 07:41:02 2004
@@ -1,47 +1,47 @@
-/*
- * 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.cocoon.template.jxtg.environment;
-
-import java.io.PrintStream;
-import java.io.PrintWriter;
-
-
-public class ErrorHolder extends Exception {
-
-    private Error err;
-
-    public ErrorHolder(Error err) {
-        super(err.getMessage());
-        this.err = err;
-    }
-
-    public void printStackTrace(PrintStream ps) {
-        err.printStackTrace(ps);
-    }
-
-    public void printStackTrace(PrintWriter pw) {
-        err.printStackTrace(pw);
-    }
-
-    public void printStackTrace() {
-        err.printStackTrace();
-    }
-
-    public Error getError() {
-        return err;
-    }
-
+/*
+ * 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.cocoon.template.jxtg.environment;
+
+import java.io.PrintStream;
+import java.io.PrintWriter;
+
+
+public class ErrorHolder extends Exception {
+
+    private Error err;
+
+    public ErrorHolder(Error err) {
+        super(err.getMessage());
+        this.err = err;
+    }
+
+    public void printStackTrace(PrintStream ps) {
+        err.printStackTrace(ps);
+    }
+
+    public void printStackTrace(PrintWriter pw) {
+        err.printStackTrace(pw);
+    }
+
+    public void printStackTrace() {
+        err.printStackTrace();
+    }
+
+    public Error getError() {
+        return err;
+    }
+
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JSIntrospector.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JSIntrospector.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JSIntrospector.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JSIntrospector.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JSIntrospector.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JSIntrospector.java	Thu Dec  9 07:41:02 2004
@@ -1,318 +1,318 @@
-/*
- * 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.cocoon.template.jxtg.environment;
-
-import java.util.Enumeration;
-import java.util.Iterator;
-
-import org.apache.commons.jexl.util.introspection.Info;
-import org.apache.commons.jexl.util.introspection.UberspectImpl;
-import org.apache.commons.jexl.util.introspection.VelMethod;
-import org.apache.commons.jexl.util.introspection.VelPropertyGet;
-import org.apache.commons.jexl.util.introspection.VelPropertySet;
-import org.apache.commons.lang.StringUtils;
-import org.mozilla.javascript.*;
-
-
-/**
- * Jexl Introspector that supports Rhino JavaScript objects
- * as well as Java Objects
- */
-public class JSIntrospector extends UberspectImpl {
-
-    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 {
-            Context cx = Context.enter();
-            try {
-                Object result;
-                Scriptable thisObj = !(thisArg instanceof Scriptable) ?
-                        Context.toObject(thisArg, scope) : (Scriptable)thisArg;
-                result = ScriptableObject.getProperty(thisObj, name);
-                Object[] newArgs = null;
-                if (args != null) {
-                    newArgs = new Object[args.length];
-                    int len = args.length;
-                    for (int i = 0; i < len; 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] = Context.toObject(args[i], scope);
-                        }
-                    }
-                }
-                result = ScriptRuntime.call(cx, result, thisObj, newArgs, scope);
-                if (result == Undefined.instance || result == Scriptable.NOT_FOUND) {
-                    result = null;
-                } else if (!(result instanceof NativeJavaClass)) {
-                    while (result instanceof Wrapper) {
-                        result = ((Wrapper)result).unwrap();
-                    }
-                }
-                return result;
-            } catch (JavaScriptException e) {
-                throw new java.lang.reflect.InvocationTargetException(e);
-            } finally {
-                Context.exit();
-            }
-        }
-
-        public boolean isCacheable() {
-            return false;
-        }
-
-        public String getMethodName() {
-            return name;
-        }
-
-        public Class getReturnType() {
-            return Object.class;
-        }
-
-    }
-
-    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 {
-            Context cx = Context.enter();
-            try {
-                Scriptable thisObj = !(thisArg instanceof Scriptable) ?
-                        Context.toObject(thisArg, scope) : (Scriptable)thisArg;
-                Object result = ScriptableObject.getProperty(thisObj, name);
-                if (result == Scriptable.NOT_FOUND) {
-                    result = ScriptableObject.getProperty(thisObj, "get" + StringUtils.capitalize(name));
-                    if (result != Scriptable.NOT_FOUND && result instanceof Function) {
-                        try {
-                            result = ((Function)result).call(
-                                    cx, ScriptableObject.getTopLevelScope(thisObj), thisObj, new Object[] {});
-                        } catch (JavaScriptException exc) {
-                            exc.printStackTrace();
-                            result = null;
-                        }
-                    }
-                }
-                if (result == Scriptable.NOT_FOUND || result == Undefined.instance) {
-                    result = null;
-                } else if (result instanceof Wrapper && !(result instanceof NativeJavaClass)) {
-                    result = ((Wrapper)result).unwrap();
-                }
-                return result;
-            } finally {
-                Context.exit();
-            }
-        }
-
-        public boolean isCacheable() {
-            return false;
-        }
-
-        public String getMethodName() {
-            return name;
-        }
-    }
-
-    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 {
-            Context.enter();
-            try {
-                Scriptable thisObj;
-                Object arg = rhs;
-                if (!(thisArg instanceof Scriptable)) {
-                    thisObj = Context.toObject(thisArg, scope);
-                } else {
-                    thisObj = (Scriptable)thisArg;
-                }
-                if (arg != null &&
-                    !(arg instanceof Number) &&
-                    !(arg instanceof Boolean) &&
-                    !(arg instanceof String) &&
-                    !(arg instanceof Scriptable)) {
-                    arg = Context.toObject(arg, scope);
-                }
-                ScriptableObject.putProperty(thisObj, name, arg);
-                return rhs;
-            } finally {
-                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() {
-            Context.enter();
-            try {
-                Object result = arr.get(index++, arr);
-                if (result == Undefined.instance ||
-                    result == Scriptable.NOT_FOUND) {
-                    result = null;
-                } else {
-                    if (!(result instanceof NativeJavaClass)) {
-                        while (result instanceof Wrapper) {
-                            result = ((Wrapper)result).unwrap();
-                        }
-                    }
-                }
-                return result;
-            } finally {
-                Context.exit();
-            }
-        }
-
-        public void remove() {
-            arr.delete(index);
-        }
-    }
-
-    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() {
-            Context.enter();
-            try {
-                Object result = ScriptableObject.getProperty(scope, ids[index++].toString());
-                if (result == Undefined.instance || result == Scriptable.NOT_FOUND) {
-                    result = null;
-                } else if (!(result instanceof NativeJavaClass)) {
-                    while (result instanceof Wrapper) {
-                        result = ((Wrapper)result).unwrap();
-                    }
-                }
-                return result;
-            } finally {
-                Context.exit();
-            }
-        }
-
-        public void remove() {
-            Context.enter();
-            try {
-                scope.delete(ids[index].toString());
-            } finally {
-                Context.exit();
-            }
-        }
-    }
-
-    public Iterator getIterator(Object obj, Info i) throws Exception {
-        if (!(obj instanceof Scriptable)) {
-            // support Enumeration
-            if (obj instanceof Enumeration) {
-                final Enumeration e = (Enumeration)obj;
-                return new Iterator() {
-
-                        public boolean hasNext() {
-                            return e.hasMoreElements();
-                        }
-
-                        public Object next() {
-                            return e.nextElement();
-                        }
-
-                        public void remove() {
-                            // no action
-                        }
-
-                    };
-            }
-            if (obj instanceof Iterator) {
-                // support Iterator
-                return (Iterator)obj;
-            }
-            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 {
-        return !(obj instanceof Scriptable) ?
-                super.getMethod(obj, methodName, args, i) : new JSMethod((Scriptable)obj, methodName);
-    }
-
-    public VelPropertyGet getPropertyGet(Object obj, String identifier, Info i) throws Exception {
-        return !(obj instanceof Scriptable) ?
-                super.getPropertyGet(obj, identifier, i) : new JSPropertyGet((Scriptable)obj, identifier);
-    }
-
-    public VelPropertySet getPropertySet(Object obj, String identifier, Object arg, Info i) throws Exception {
-        return !(obj instanceof Scriptable) ?
-                super.getPropertySet(obj, identifier, arg, i) : new JSPropertySet((Scriptable)obj, identifier);
-    }
+/*
+ * 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.cocoon.template.jxtg.environment;
+
+import java.util.Enumeration;
+import java.util.Iterator;
+
+import org.apache.commons.jexl.util.introspection.Info;
+import org.apache.commons.jexl.util.introspection.UberspectImpl;
+import org.apache.commons.jexl.util.introspection.VelMethod;
+import org.apache.commons.jexl.util.introspection.VelPropertyGet;
+import org.apache.commons.jexl.util.introspection.VelPropertySet;
+import org.apache.commons.lang.StringUtils;
+import org.mozilla.javascript.*;
+
+
+/**
+ * Jexl Introspector that supports Rhino JavaScript objects
+ * as well as Java Objects
+ */
+public class JSIntrospector extends UberspectImpl {
+
+    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 {
+            Context cx = Context.enter();
+            try {
+                Object result;
+                Scriptable thisObj = !(thisArg instanceof Scriptable) ?
+                        Context.toObject(thisArg, scope) : (Scriptable)thisArg;
+                result = ScriptableObject.getProperty(thisObj, name);
+                Object[] newArgs = null;
+                if (args != null) {
+                    newArgs = new Object[args.length];
+                    int len = args.length;
+                    for (int i = 0; i < len; 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] = Context.toObject(args[i], scope);
+                        }
+                    }
+                }
+                result = ScriptRuntime.call(cx, result, thisObj, newArgs, scope);
+                if (result == Undefined.instance || result == Scriptable.NOT_FOUND) {
+                    result = null;
+                } else if (!(result instanceof NativeJavaClass)) {
+                    while (result instanceof Wrapper) {
+                        result = ((Wrapper)result).unwrap();
+                    }
+                }
+                return result;
+            } catch (JavaScriptException e) {
+                throw new java.lang.reflect.InvocationTargetException(e);
+            } finally {
+                Context.exit();
+            }
+        }
+
+        public boolean isCacheable() {
+            return false;
+        }
+
+        public String getMethodName() {
+            return name;
+        }
+
+        public Class getReturnType() {
+            return Object.class;
+        }
+
+    }
+
+    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 {
+            Context cx = Context.enter();
+            try {
+                Scriptable thisObj = !(thisArg instanceof Scriptable) ?
+                        Context.toObject(thisArg, scope) : (Scriptable)thisArg;
+                Object result = ScriptableObject.getProperty(thisObj, name);
+                if (result == Scriptable.NOT_FOUND) {
+                    result = ScriptableObject.getProperty(thisObj, "get" + StringUtils.capitalize(name));
+                    if (result != Scriptable.NOT_FOUND && result instanceof Function) {
+                        try {
+                            result = ((Function)result).call(
+                                    cx, ScriptableObject.getTopLevelScope(thisObj), thisObj, new Object[] {});
+                        } catch (JavaScriptException exc) {
+                            exc.printStackTrace();
+                            result = null;
+                        }
+                    }
+                }
+                if (result == Scriptable.NOT_FOUND || result == Undefined.instance) {
+                    result = null;
+                } else if (result instanceof Wrapper && !(result instanceof NativeJavaClass)) {
+                    result = ((Wrapper)result).unwrap();
+                }
+                return result;
+            } finally {
+                Context.exit();
+            }
+        }
+
+        public boolean isCacheable() {
+            return false;
+        }
+
+        public String getMethodName() {
+            return name;
+        }
+    }
+
+    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 {
+            Context.enter();
+            try {
+                Scriptable thisObj;
+                Object arg = rhs;
+                if (!(thisArg instanceof Scriptable)) {
+                    thisObj = Context.toObject(thisArg, scope);
+                } else {
+                    thisObj = (Scriptable)thisArg;
+                }
+                if (arg != null &&
+                    !(arg instanceof Number) &&
+                    !(arg instanceof Boolean) &&
+                    !(arg instanceof String) &&
+                    !(arg instanceof Scriptable)) {
+                    arg = Context.toObject(arg, scope);
+                }
+                ScriptableObject.putProperty(thisObj, name, arg);
+                return rhs;
+            } finally {
+                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() {
+            Context.enter();
+            try {
+                Object result = arr.get(index++, arr);
+                if (result == Undefined.instance ||
+                    result == Scriptable.NOT_FOUND) {
+                    result = null;
+                } else {
+                    if (!(result instanceof NativeJavaClass)) {
+                        while (result instanceof Wrapper) {
+                            result = ((Wrapper)result).unwrap();
+                        }
+                    }
+                }
+                return result;
+            } finally {
+                Context.exit();
+            }
+        }
+
+        public void remove() {
+            arr.delete(index);
+        }
+    }
+
+    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() {
+            Context.enter();
+            try {
+                Object result = ScriptableObject.getProperty(scope, ids[index++].toString());
+                if (result == Undefined.instance || result == Scriptable.NOT_FOUND) {
+                    result = null;
+                } else if (!(result instanceof NativeJavaClass)) {
+                    while (result instanceof Wrapper) {
+                        result = ((Wrapper)result).unwrap();
+                    }
+                }
+                return result;
+            } finally {
+                Context.exit();
+            }
+        }
+
+        public void remove() {
+            Context.enter();
+            try {
+                scope.delete(ids[index].toString());
+            } finally {
+                Context.exit();
+            }
+        }
+    }
+
+    public Iterator getIterator(Object obj, Info i) throws Exception {
+        if (!(obj instanceof Scriptable)) {
+            // support Enumeration
+            if (obj instanceof Enumeration) {
+                final Enumeration e = (Enumeration)obj;
+                return new Iterator() {
+
+                        public boolean hasNext() {
+                            return e.hasMoreElements();
+                        }
+
+                        public Object next() {
+                            return e.nextElement();
+                        }
+
+                        public void remove() {
+                            // no action
+                        }
+
+                    };
+            }
+            if (obj instanceof Iterator) {
+                // support Iterator
+                return (Iterator)obj;
+            }
+            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 {
+        return !(obj instanceof Scriptable) ?
+                super.getMethod(obj, methodName, args, i) : new JSMethod((Scriptable)obj, methodName);
+    }
+
+    public VelPropertyGet getPropertyGet(Object obj, String identifier, Info i) throws Exception {
+        return !(obj instanceof Scriptable) ?
+                super.getPropertyGet(obj, identifier, i) : new JSPropertyGet((Scriptable)obj, identifier);
+    }
+
+    public VelPropertySet getPropertySet(Object obj, String identifier, Object arg, Info i) throws Exception {
+        return !(obj instanceof Scriptable) ?
+                super.getPropertySet(obj, identifier, arg, i) : new JSPropertySet((Scriptable)obj, identifier);
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JXCacheKey.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JXCacheKey.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JXCacheKey.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JXCacheKey.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JXCacheKey.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JXCacheKey.java	Thu Dec  9 07:41:02 2004
@@ -1,45 +1,45 @@
-/*
- * 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.cocoon.template.jxtg.environment;
-
-import java.io.Serializable;
-
-public final class JXCacheKey implements Serializable {
-    private final String templateUri;
-    private final Serializable templateKey;
-
-    public JXCacheKey(String templateUri, Serializable templateKey) {
-        this.templateUri = templateUri;
-        this.templateKey = templateKey;
-    }
-
-    public int hashCode() {
-        return templateUri.hashCode() + templateKey.hashCode();
-    }
-
-    public String toString() {
-        return "TK:" + templateUri + "_" + templateKey;
-    }
-
-    public boolean equals(Object o) {
-        if (o instanceof JXCacheKey) {
-            JXCacheKey jxck = (JXCacheKey) o;
-            return this.templateUri.equals(jxck.templateUri)
-                    && this.templateKey.equals(jxck.templateKey);
-        }
-        return false;
-    }
+/*
+ * 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.cocoon.template.jxtg.environment;
+
+import java.io.Serializable;
+
+public final class JXCacheKey implements Serializable {
+    private final String templateUri;
+    private final Serializable templateKey;
+
+    public JXCacheKey(String templateUri, Serializable templateKey) {
+        this.templateUri = templateUri;
+        this.templateKey = templateKey;
+    }
+
+    public int hashCode() {
+        return templateUri.hashCode() + templateKey.hashCode();
+    }
+
+    public String toString() {
+        return "TK:" + templateUri + "_" + templateKey;
+    }
+
+    public boolean equals(Object o) {
+        if (o instanceof JXCacheKey) {
+            JXCacheKey jxck = (JXCacheKey) o;
+            return this.templateUri.equals(jxck.templateUri)
+                    && this.templateKey.equals(jxck.templateKey);
+        }
+        return false;
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JXSourceValidity.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JXSourceValidity.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JXSourceValidity.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JXSourceValidity.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JXSourceValidity.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/JXSourceValidity.java	Thu Dec  9 07:41:02 2004
@@ -1,70 +1,70 @@
-/*
- * 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.cocoon.template.jxtg.environment;
-
-import java.io.Serializable;
-
-import org.apache.excalibur.source.SourceValidity;
-
-public final class JXSourceValidity implements SourceValidity, Serializable {
-    private final SourceValidity sourceValidity;
-    private final SourceValidity templateValidity;
-
-    public JXSourceValidity(SourceValidity sourceValidity,
-            SourceValidity templateValidity) {
-        this.sourceValidity = sourceValidity;
-        this.templateValidity = templateValidity;
-    }
-
-    public int isValid() {
-        switch (sourceValidity.isValid()) {
-        case SourceValidity.INVALID:
-            return SourceValidity.INVALID;
-        case SourceValidity.UNKNOWN: {
-            if (templateValidity.isValid() == SourceValidity.INVALID) {
-                return SourceValidity.INVALID;
-            } else {
-                return SourceValidity.UNKNOWN;
-            }
-        }
-        case SourceValidity.VALID:
-            return templateValidity.isValid();
-        }
-        return SourceValidity.UNKNOWN;
-    }
-
-    public int isValid(SourceValidity otherValidity) {
-        if (otherValidity instanceof JXSourceValidity) {
-            JXSourceValidity otherJXValidity = (JXSourceValidity) otherValidity;
-            switch (sourceValidity.isValid(otherJXValidity.sourceValidity)) {
-            case SourceValidity.INVALID:
-                return SourceValidity.INVALID;
-            case SourceValidity.UNKNOWN: {
-                if (templateValidity.isValid(otherJXValidity.templateValidity) == SourceValidity.INVALID) {
-                    return SourceValidity.INVALID;
-                } else {
-                    return SourceValidity.UNKNOWN;
-                }
-            }
-            case SourceValidity.VALID:
-                return templateValidity
-                        .isValid(otherJXValidity.templateValidity);
-            }
-        }
-        return 0;
-    }
-
+/*
+ * 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.cocoon.template.jxtg.environment;
+
+import java.io.Serializable;
+
+import org.apache.excalibur.source.SourceValidity;
+
+public final class JXSourceValidity implements SourceValidity, Serializable {
+    private final SourceValidity sourceValidity;
+    private final SourceValidity templateValidity;
+
+    public JXSourceValidity(SourceValidity sourceValidity,
+            SourceValidity templateValidity) {
+        this.sourceValidity = sourceValidity;
+        this.templateValidity = templateValidity;
+    }
+
+    public int isValid() {
+        switch (sourceValidity.isValid()) {
+        case SourceValidity.INVALID:
+            return SourceValidity.INVALID;
+        case SourceValidity.UNKNOWN: {
+            if (templateValidity.isValid() == SourceValidity.INVALID) {
+                return SourceValidity.INVALID;
+            } else {
+                return SourceValidity.UNKNOWN;
+            }
+        }
+        case SourceValidity.VALID:
+            return templateValidity.isValid();
+        }
+        return SourceValidity.UNKNOWN;
+    }
+
+    public int isValid(SourceValidity otherValidity) {
+        if (otherValidity instanceof JXSourceValidity) {
+            JXSourceValidity otherJXValidity = (JXSourceValidity) otherValidity;
+            switch (sourceValidity.isValid(otherJXValidity.sourceValidity)) {
+            case SourceValidity.INVALID:
+                return SourceValidity.INVALID;
+            case SourceValidity.UNKNOWN: {
+                if (templateValidity.isValid(otherJXValidity.templateValidity) == SourceValidity.INVALID) {
+                    return SourceValidity.INVALID;
+                } else {
+                    return SourceValidity.UNKNOWN;
+                }
+            }
+            case SourceValidity.VALID:
+                return templateValidity
+                        .isValid(otherJXValidity.templateValidity);
+            }
+        }
+        return 0;
+    }
+
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/LocatorFacade.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/LocatorFacade.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/LocatorFacade.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/LocatorFacade.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/LocatorFacade.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/LocatorFacade.java	Thu Dec  9 07:41:02 2004
@@ -1,50 +1,50 @@
-/*
- * 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.cocoon.template.jxtg.environment;
-
-import org.xml.sax.Locator;
-
-/**
- * Facade to the Locator to be set on the consumer prior to sending other
- * events, location member changeable
- */
-public class LocatorFacade implements Locator {
-    private Locator locator;
-
-    public LocatorFacade(Locator initialLocator) {
-        this.locator = initialLocator;
-    }
-
-    public void setDocumentLocator(Locator newLocator) {
-        this.locator = newLocator;
-    }
-
-    public int getColumnNumber() {
-        return this.locator.getColumnNumber();
-    }
-
-    public int getLineNumber() {
-        return this.locator.getLineNumber();
-    }
-
-    public String getPublicId() {
-        return this.locator.getPublicId();
-    }
-
-    public String getSystemId() {
-        return this.locator.getSystemId();
-    }
+/*
+ * 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.cocoon.template.jxtg.environment;
+
+import org.xml.sax.Locator;
+
+/**
+ * Facade to the Locator to be set on the consumer prior to sending other
+ * events, location member changeable
+ */
+public class LocatorFacade implements Locator {
+    private Locator locator;
+
+    public LocatorFacade(Locator initialLocator) {
+        this.locator = initialLocator;
+    }
+
+    public void setDocumentLocator(Locator newLocator) {
+        this.locator = newLocator;
+    }
+
+    public int getColumnNumber() {
+        return this.locator.getColumnNumber();
+    }
+
+    public int getLineNumber() {
+        return this.locator.getLineNumber();
+    }
+
+    public String getPublicId() {
+        return this.locator.getPublicId();
+    }
+
+    public String getSystemId() {
+        return this.locator.getSystemId();
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/MyVariables.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/MyVariables.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/MyVariables.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/MyVariables.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/MyVariables.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/MyVariables.java	Thu Dec  9 07:41:02 2004
@@ -1,103 +1,103 @@
-/*
- * 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.cocoon.template.jxtg.environment;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.cocoon.components.flow.WebContinuation;
-import org.apache.commons.jxpath.Variables;
-
-public class MyVariables implements Variables {
-    MyVariables closure;
-    Map localVariables = new HashMap();
-
-    static final String[] VARIABLES = new String[] { "cocoon", "continuation",
-            "flowContext", "request", "response", "context", "session",
-            "parameters" };
-
-    Object cocoon;
-
-    // backward compatibility
-    Object bean, kont, request, response, session, context, parameters;
-
-    public MyVariables(Object cocoon, Object bean, WebContinuation kont,
-            Object request, Object session, Object context, Object parameters) {
-        this.cocoon = cocoon;
-        this.bean = bean;
-        this.kont = kont;
-        this.request = request;
-        this.session = session;
-        this.context = context;
-        this.parameters = parameters;
-    }
-
-    public MyVariables(MyVariables parent) {
-        this.closure = parent;
-    }
-
-    public boolean isDeclaredVariable(String varName) {
-        int len = VARIABLES.length;
-        for (int i = 0; i < len; i++) {
-            if (varName.equals(VARIABLES[i])) {
-                return true;
-            }
-        }
-        if (localVariables.containsKey(varName)) {
-            return true;
-        }
-        if (closure != null) {
-            return closure.isDeclaredVariable(varName);
-        }
-        return false;
-    }
-
-    public Object getVariable(String varName) {
-        Object result = localVariables.get(varName);
-        if (result != null) {
-            return result;
-        }
-        if (closure != null) {
-            return closure.getVariable(varName);
-        }
-        if (varName.equals("cocoon")) {
-            return cocoon;
-        }
-        // backward compatibility
-        if (varName.equals("continuation")) {
-            return kont;
-        } else if (varName.equals("flowContext")) {
-            return bean;
-        } else if (varName.equals("request")) {
-            return request;
-        } 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) {
-        localVariables.put(varName, value);
-    }
-
-    public void undeclareVariable(String varName) {
-        localVariables.remove(varName);
-    }
+/*
+ * 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.cocoon.template.jxtg.environment;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.cocoon.components.flow.WebContinuation;
+import org.apache.commons.jxpath.Variables;
+
+public class MyVariables implements Variables {
+    MyVariables closure;
+    Map localVariables = new HashMap();
+
+    static final String[] VARIABLES = new String[] { "cocoon", "continuation",
+            "flowContext", "request", "response", "context", "session",
+            "parameters" };
+
+    Object cocoon;
+
+    // backward compatibility
+    Object bean, kont, request, response, session, context, parameters;
+
+    public MyVariables(Object cocoon, Object bean, WebContinuation kont,
+            Object request, Object session, Object context, Object parameters) {
+        this.cocoon = cocoon;
+        this.bean = bean;
+        this.kont = kont;
+        this.request = request;
+        this.session = session;
+        this.context = context;
+        this.parameters = parameters;
+    }
+
+    public MyVariables(MyVariables parent) {
+        this.closure = parent;
+    }
+
+    public boolean isDeclaredVariable(String varName) {
+        int len = VARIABLES.length;
+        for (int i = 0; i < len; i++) {
+            if (varName.equals(VARIABLES[i])) {
+                return true;
+            }
+        }
+        if (localVariables.containsKey(varName)) {
+            return true;
+        }
+        if (closure != null) {
+            return closure.isDeclaredVariable(varName);
+        }
+        return false;
+    }
+
+    public Object getVariable(String varName) {
+        Object result = localVariables.get(varName);
+        if (result != null) {
+            return result;
+        }
+        if (closure != null) {
+            return closure.getVariable(varName);
+        }
+        if (varName.equals("cocoon")) {
+            return cocoon;
+        }
+        // backward compatibility
+        if (varName.equals("continuation")) {
+            return kont;
+        } else if (varName.equals("flowContext")) {
+            return bean;
+        } else if (varName.equals("request")) {
+            return request;
+        } 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) {
+        localVariables.put(varName, value);
+    }
+
+    public void undeclareVariable(String varName) {
+        localVariables.remove(varName);
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/ValueHelper.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/ValueHelper.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/ValueHelper.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/ValueHelper.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/ValueHelper.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/environment/ValueHelper.java	Thu Dec  9 07:41:02 2004
@@ -1,185 +1,185 @@
-/*
- * 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.cocoon.template.jxtg.environment;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Locale;
-
-import org.apache.cocoon.template.jxtg.expression.JXTExpression;
-import org.apache.commons.jexl.Expression;
-import org.apache.commons.jexl.JexlContext;
-import org.apache.commons.jxpath.CompiledExpression;
-import org.apache.commons.jxpath.JXPathContext;
-import org.apache.commons.jxpath.Pointer;
-import org.apache.commons.lang.StringUtils;
-import org.w3c.dom.Node;
-
-/**
- */
-public class ValueHelper {
-
-    public static Locale parseLocale(String locale, String variant) {
-        Locale ret = null;
-        String language = locale;
-        String country = null;
-        int index = StringUtils.indexOfAny(locale, "-_");
-    
-        if (index > -1) {
-            language = locale.substring(0, index);
-            country = locale.substring(index + 1);
-        }
-        if (StringUtils.isEmpty(language)) {
-            throw new IllegalArgumentException("No language in locale");
-        }
-        if (country == null) {
-            ret = variant != null ? new Locale(language, "", variant) : new Locale(language, ""); 
-        } else if (country.length() > 0) {
-            ret = variant != null ? new Locale(language, country, variant) : new Locale(language, country); 
-        } else {
-            throw new IllegalArgumentException("Empty country in locale");
-        }
-        return ret;
-    }
-
-    // Hack: try to prevent JXPath from converting result to a String
-    public static Object getNode(JXTExpression expr, JexlContext jexlContext, JXPathContext jxpathContext, Boolean lenient)
-        	throws Exception {
-        try {
-            Object compiled = expr.getCompiledExpression();
-            if (compiled instanceof CompiledExpression) {
-                CompiledExpression e = (CompiledExpression)compiled;
-                boolean oldLenient = jxpathContext.isLenient();
-                if (lenient != null) jxpathContext.setLenient(lenient.booleanValue());
-                try {
-                    Iterator iter = e.iteratePointers(jxpathContext);
-                    if (iter.hasNext()) {
-                        Pointer first = (Pointer)iter.next();
-                        if (iter.hasNext()) {
-    	                    List result = new LinkedList();
-    	                    result.add(first.getNode());
-    	                    boolean dom = (first.getNode() instanceof Node);
-    	                    while (iter.hasNext()) {
-    	                        Object obj = ((Pointer)iter.next()).getNode();
-    	                        dom = dom && (obj instanceof Node);
-    	                        result.add(obj);
-    	                    }
-    	                    Object[] arr;
-    	                    if (dom) {
-    	                        arr = new Node[result.size()];
-    	                    } else {
-    	                        arr = new Object[result.size()];
-    	                    }
-    	                    result.toArray(arr);
-    	                    return arr;
-                    	}
-                    	return first.getNode();                    
-                    }
-                    return null;
-                } finally {
-                    jxpathContext.setLenient(oldLenient);
-                }
-            } else if (compiled instanceof Expression) {
-                Expression e = (Expression)compiled;
-                return e.evaluate(jexlContext);
-            }
-            return expr.getRaw();
-        } catch (InvocationTargetException e) {
-            Throwable t = e.getTargetException();
-            if (t instanceof Exception) {
-                throw (Exception)t;
-            }
-            throw (Error)t;
-        }
-    }
-
-    public static Object getNode(JXTExpression expr, JexlContext jexlContext, JXPathContext jxpathContext) throws Exception {
-        return getNode(expr, jexlContext, jxpathContext, null);
-    }
-
-    public static Boolean getBooleanValue(JXTExpression expr, JexlContext jexlContext,
-                                    JXPathContext jxpathContext) throws Exception {
-        Object res = ValueHelper.getValue(expr, jexlContext, jxpathContext);
-        return res instanceof Boolean ? (Boolean)res : null;
-    }
-
-    public static String getStringValue(JXTExpression expr, JexlContext jexlContext,
-                                JXPathContext jxpathContext) throws Exception {
-        Object res = ValueHelper.getValue(expr, jexlContext, jxpathContext);
-        if (res != null) {
-            return res.toString();
-        }
-        if (expr != null && expr.getCompiledExpression() == null) {
-            return expr.getRaw();
-        }
-        return null;
-    }
-
-    public static Number getNumberValue(JXTExpression expr, JexlContext jexlContext, JXPathContext jxpathContext) throws Exception {
-        Object res = ValueHelper.getValue(expr, jexlContext, jxpathContext);
-        if (res instanceof Number) {
-            return (Number)res;
-        }
-        if (res != null) {
-            return Double.valueOf(res.toString());
-        }
-        return null;
-    }
-
-    public static int getIntValue(JXTExpression expr, JexlContext jexlContext, JXPathContext jxpathContext) throws Exception {
-        Object res = ValueHelper.getValue(expr, jexlContext, jxpathContext);
-        return res instanceof Number ? ((Number)res).intValue() : 0;
-    }
-
-    public static Object getValue(JXTExpression expr, JexlContext jexlContext, JXPathContext jxpathContext) throws Exception {
-        return ValueHelper.getValue(expr, jexlContext, jxpathContext, null);
-    }
-
-    public static Object getValue(JXTExpression expr, JexlContext jexlContext,
-            JXPathContext jxpathContext, Boolean lenient) throws Exception {
-        if (expr != null) {
-            Object compiled = expr.getCompiledExpression();
-            try {
-                if (compiled instanceof CompiledExpression) {
-                    CompiledExpression e = (CompiledExpression) compiled;
-                    boolean oldLenient = jxpathContext.isLenient();
-                    if (lenient != null) {
-                        jxpathContext.setLenient(lenient.booleanValue());
-                    }
-                    try {
-                        return e.getValue(jxpathContext);
-                    } finally {
-                        jxpathContext.setLenient(oldLenient);
-                    }
-                } else if (compiled instanceof Expression) {
-                    Expression e = (Expression) compiled;
-                    return e.evaluate(jexlContext);
-                }
-                return compiled;
-            } catch (InvocationTargetException e) {
-                Throwable t = e.getTargetException();
-                if (t instanceof Exception) {
-                    throw (Exception) t;
-                }
-                throw (Error) t;
-            }
-        } else {
-            return null;
-        }
-    }
-}
+/*
+ * 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.cocoon.template.jxtg.environment;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Locale;
+
+import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+import org.apache.commons.jexl.Expression;
+import org.apache.commons.jexl.JexlContext;
+import org.apache.commons.jxpath.CompiledExpression;
+import org.apache.commons.jxpath.JXPathContext;
+import org.apache.commons.jxpath.Pointer;
+import org.apache.commons.lang.StringUtils;
+import org.w3c.dom.Node;
+
+/**
+ */
+public class ValueHelper {
+
+    public static Locale parseLocale(String locale, String variant) {
+        Locale ret = null;
+        String language = locale;
+        String country = null;
+        int index = StringUtils.indexOfAny(locale, "-_");
+    
+        if (index > -1) {
+            language = locale.substring(0, index);
+            country = locale.substring(index + 1);
+        }
+        if (StringUtils.isEmpty(language)) {
+            throw new IllegalArgumentException("No language in locale");
+        }
+        if (country == null) {
+            ret = variant != null ? new Locale(language, "", variant) : new Locale(language, ""); 
+        } else if (country.length() > 0) {
+            ret = variant != null ? new Locale(language, country, variant) : new Locale(language, country); 
+        } else {
+            throw new IllegalArgumentException("Empty country in locale");
+        }
+        return ret;
+    }
+
+    // Hack: try to prevent JXPath from converting result to a String
+    public static Object getNode(JXTExpression expr, JexlContext jexlContext, JXPathContext jxpathContext, Boolean lenient)
+        	throws Exception {
+        try {
+            Object compiled = expr.getCompiledExpression();
+            if (compiled instanceof CompiledExpression) {
+                CompiledExpression e = (CompiledExpression)compiled;
+                boolean oldLenient = jxpathContext.isLenient();
+                if (lenient != null) jxpathContext.setLenient(lenient.booleanValue());
+                try {
+                    Iterator iter = e.iteratePointers(jxpathContext);
+                    if (iter.hasNext()) {
+                        Pointer first = (Pointer)iter.next();
+                        if (iter.hasNext()) {
+    	                    List result = new LinkedList();
+    	                    result.add(first.getNode());
+    	                    boolean dom = (first.getNode() instanceof Node);
+    	                    while (iter.hasNext()) {
+    	                        Object obj = ((Pointer)iter.next()).getNode();
+    	                        dom = dom && (obj instanceof Node);
+    	                        result.add(obj);
+    	                    }
+    	                    Object[] arr;
+    	                    if (dom) {
+    	                        arr = new Node[result.size()];
+    	                    } else {
+    	                        arr = new Object[result.size()];
+    	                    }
+    	                    result.toArray(arr);
+    	                    return arr;
+                    	}
+                    	return first.getNode();                    
+                    }
+                    return null;
+                } finally {
+                    jxpathContext.setLenient(oldLenient);
+                }
+            } else if (compiled instanceof Expression) {
+                Expression e = (Expression)compiled;
+                return e.evaluate(jexlContext);
+            }
+            return expr.getRaw();
+        } catch (InvocationTargetException e) {
+            Throwable t = e.getTargetException();
+            if (t instanceof Exception) {
+                throw (Exception)t;
+            }
+            throw (Error)t;
+        }
+    }
+
+    public static Object getNode(JXTExpression expr, JexlContext jexlContext, JXPathContext jxpathContext) throws Exception {
+        return getNode(expr, jexlContext, jxpathContext, null);
+    }
+
+    public static Boolean getBooleanValue(JXTExpression expr, JexlContext jexlContext,
+                                    JXPathContext jxpathContext) throws Exception {
+        Object res = ValueHelper.getValue(expr, jexlContext, jxpathContext);
+        return res instanceof Boolean ? (Boolean)res : null;
+    }
+
+    public static String getStringValue(JXTExpression expr, JexlContext jexlContext,
+                                JXPathContext jxpathContext) throws Exception {
+        Object res = ValueHelper.getValue(expr, jexlContext, jxpathContext);
+        if (res != null) {
+            return res.toString();
+        }
+        if (expr != null && expr.getCompiledExpression() == null) {
+            return expr.getRaw();
+        }
+        return null;
+    }
+
+    public static Number getNumberValue(JXTExpression expr, JexlContext jexlContext, JXPathContext jxpathContext) throws Exception {
+        Object res = ValueHelper.getValue(expr, jexlContext, jxpathContext);
+        if (res instanceof Number) {
+            return (Number)res;
+        }
+        if (res != null) {
+            return Double.valueOf(res.toString());
+        }
+        return null;
+    }
+
+    public static int getIntValue(JXTExpression expr, JexlContext jexlContext, JXPathContext jxpathContext) throws Exception {
+        Object res = ValueHelper.getValue(expr, jexlContext, jxpathContext);
+        return res instanceof Number ? ((Number)res).intValue() : 0;
+    }
+
+    public static Object getValue(JXTExpression expr, JexlContext jexlContext, JXPathContext jxpathContext) throws Exception {
+        return ValueHelper.getValue(expr, jexlContext, jxpathContext, null);
+    }
+
+    public static Object getValue(JXTExpression expr, JexlContext jexlContext,
+            JXPathContext jxpathContext, Boolean lenient) throws Exception {
+        if (expr != null) {
+            Object compiled = expr.getCompiledExpression();
+            try {
+                if (compiled instanceof CompiledExpression) {
+                    CompiledExpression e = (CompiledExpression) compiled;
+                    boolean oldLenient = jxpathContext.isLenient();
+                    if (lenient != null) {
+                        jxpathContext.setLenient(lenient.booleanValue());
+                    }
+                    try {
+                        return e.getValue(jxpathContext);
+                    } finally {
+                        jxpathContext.setLenient(oldLenient);
+                    }
+                } else if (compiled instanceof Expression) {
+                    Expression e = (Expression) compiled;
+                    return e.evaluate(jexlContext);
+                }
+                return compiled;
+            } catch (InvocationTargetException e) {
+                Throwable t = e.getTargetException();
+                if (t instanceof Exception) {
+                    throw (Exception) t;
+                }
+                throw (Error) t;
+            }
+        } else {
+            return null;
+        }
+    }
+}

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/JXTExpression.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/JXTExpression.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/JXTExpression.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/JXTExpression.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/JXTExpression.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/JXTExpression.java	Thu Dec  9 07:41:02 2004
@@ -1,39 +1,39 @@
-/*
- * 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.cocoon.template.jxtg.expression;
-
-
-public class JXTExpression extends Subst {
-    public JXTExpression(String raw, Object expr) {
-        this.raw = raw;
-        this.compiledExpression = expr;
-    }
-
-    String raw;
-    Object compiledExpression;
-
-    public Object getCompiledExpression() {
-        return compiledExpression;
-    }
-
-    public void setCompiledExpression(Object compiledExpression) {
-        this.compiledExpression = compiledExpression;
-    }
-
-    public String getRaw() {
-        return raw;
-    }
+/*
+ * 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.cocoon.template.jxtg.expression;
+
+
+public class JXTExpression extends Subst {
+    public JXTExpression(String raw, Object expr) {
+        this.raw = raw;
+        this.compiledExpression = expr;
+    }
+
+    String raw;
+    Object compiledExpression;
+
+    public Object getCompiledExpression() {
+        return compiledExpression;
+    }
+
+    public void setCompiledExpression(Object compiledExpression) {
+        this.compiledExpression = compiledExpression;
+    }
+
+    public String getRaw() {
+        return raw;
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/Literal.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/Literal.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/Literal.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/Literal.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/Literal.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/Literal.java	Thu Dec  9 07:41:02 2004
@@ -1,28 +1,28 @@
-/*
- * 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.cocoon.template.jxtg.expression;
-
-public class Literal extends Subst {
-    public Literal(String val) {
-        this.value = val;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    private final String value;
+/*
+ * 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.cocoon.template.jxtg.expression;
+
+public class Literal extends Subst {
+    public Literal(String val) {
+        this.value = val;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    private final String value;
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/MyJexlContext.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/MyJexlContext.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/MyJexlContext.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/MyJexlContext.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/MyJexlContext.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/MyJexlContext.java	Thu Dec  9 07:41:02 2004
@@ -1,56 +1,56 @@
-/*
- * 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.cocoon.template.jxtg.expression;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.commons.jexl.JexlContext;
-
-public class MyJexlContext extends HashMap implements JexlContext {
-    private MyJexlContext closure;
-
-    public MyJexlContext() {
-        this(null);
-    }
-
-    public MyJexlContext(MyJexlContext closure) {
-        this.closure = closure;
-    }
-
-    public Map getVars() {
-        return this;
-    }
-
-    public void setVars(Map map) {
-        putAll(map);
-    }
-
-    public boolean containsKey(Object key) {
-        return this.get(key) != null;
-    }
-
-    public Object get(Object key) {
-        if (key.equals("this")) {
-            return this;
-        }
-        Object result = super.get(key);
-        if (result == null && closure != null) {
-            result = closure.get(key);
-        }
-        return result;
-    }
+/*
+ * 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.cocoon.template.jxtg.expression;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.commons.jexl.JexlContext;
+
+public class MyJexlContext extends HashMap implements JexlContext {
+    private MyJexlContext closure;
+
+    public MyJexlContext() {
+        this(null);
+    }
+
+    public MyJexlContext(MyJexlContext closure) {
+        this.closure = closure;
+    }
+
+    public Map getVars() {
+        return this;
+    }
+
+    public void setVars(Map map) {
+        putAll(map);
+    }
+
+    public boolean containsKey(Object key) {
+        return this.get(key) != null;
+    }
+
+    public Object get(Object key) {
+        if (key.equals("this")) {
+            return this;
+        }
+        Object result = super.get(key);
+        if (result == null && closure != null) {
+            result = closure.get(key);
+        }
+        return result;
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/Subst.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/Subst.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/Subst.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/Subst.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/Subst.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/expression/Subst.java	Thu Dec  9 07:41:02 2004
@@ -1,20 +1,20 @@
-/*
- * 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.cocoon.template.jxtg.expression;
-
-public class Subst {
-    // VOID
+/*
+ * 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.cocoon.template.jxtg.expression;
+
+public class Subst {
+    // VOID
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Parser.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Parser.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Parser.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Parser.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Parser.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Parser.java	Thu Dec  9 07:41:02 2004
@@ -1,585 +1,585 @@
-/*
- * 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.cocoon.template.jxtg.script;
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.Iterator;
-import java.util.Stack;
-
-import org.apache.cocoon.template.jxtg.JXTemplateGenerator;
-import org.apache.cocoon.template.jxtg.environment.ErrorHolder;
-import org.apache.cocoon.template.jxtg.expression.JXTExpression;
-import org.apache.cocoon.template.jxtg.script.event.*;
-import org.apache.commons.jexl.ExpressionFactory;
-import org.apache.commons.jxpath.JXPathContext;
-import org.apache.commons.lang.StringUtils;
-import org.xml.sax.Attributes;
-import org.xml.sax.ContentHandler;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.ext.LexicalHandler;
-import org.xml.sax.helpers.AttributesImpl;
-import org.xml.sax.helpers.LocatorImpl;
-
-public class Parser implements ContentHandler, LexicalHandler {
-
-    StartDocument startEvent;
-    Event lastEvent;
-    Stack stack = new Stack();
-    Locator locator;
-    Locator charLocation;
-    StringBuffer charBuf;
-
-    final static String TEMPLATE = "template";
-    final static String FOR_EACH = "forEach";
-    final static String IF = "if";
-    final static String CHOOSE = "choose";
-    final static String WHEN = "when";
-    final static String OTHERWISE = "otherwise";
-    final static String OUT = "out";
-    final static String IMPORT = "import";
-    final static String SET = "set";
-    final static String MACRO = "macro";
-    final static String EVALBODY = "evalBody";
-    final static String EVAL = "eval";
-    final static String PARAMETER = "parameter";
-    final static String FORMAT_NUMBER = "formatNumber";
-    final static String FORMAT_DATE = "formatDate";
-    final static String COMMENT = "comment";
-
-    public Parser() {
-        // EMPTY
-    }
-
-    public StartDocument getStartEvent() {
-        return this.startEvent;
-    }
-
-    protected void recycle() {
-        startEvent = null;
-        lastEvent = null;
-        stack.clear();
-        locator = null;
-        charLocation = null;
-        charBuf = null;
-    }
-
-    private void addEvent(Event ev) throws SAXException {
-        if (ev != null) {
-            if (lastEvent == null) {
-                lastEvent = startEvent = new StartDocument(locator);
-            } else {
-                flushChars();
-            }
-            lastEvent.setNext(ev);
-            lastEvent = ev;
-        } else {
-            throw new NullPointerException("null event");
-        }
-    }
-
-    void flushChars() throws SAXException {
-        if (charBuf != null) {
-            char[] chars = new char[charBuf.length()];
-            charBuf.getChars(0, charBuf.length(), chars, 0);
-            Characters ev = new Characters(charLocation, chars, 0, chars.length);
-            lastEvent.setNext(ev);
-            lastEvent = ev;
-            charLocation = null;
-            charBuf = null;
-        }
-    }
-
-    public void characters(char[] ch, int start, int length)
-            throws SAXException {
-        if (charBuf == null) {
-            charBuf = new StringBuffer(length);
-            charLocation = locator != null ? new LocatorImpl(locator)
-                    : JXTemplateGenerator.NULL_LOCATOR;
-        }
-        charBuf.append(ch, start, length);
-    }
-
-    public void endDocument() throws SAXException {
-        StartDocument startDoc = (StartDocument) stack.pop();
-        EndDocument endDoc = new EndDocument(locator);
-        startDoc.setEndDocument(endDoc);
-        addEvent(endDoc);
-    }
-
-    public void endElement(String namespaceURI, String localName, String raw)
-            throws SAXException {
-        Event start = (Event) stack.pop();
-        Event newEvent = null;
-        if (JXTemplateGenerator.NS.equals(namespaceURI)) {
-            StartInstruction startInstruction = (StartInstruction) start;
-            EndInstruction endInstruction = new EndInstruction(locator,
-                    startInstruction);
-            newEvent = endInstruction;
-            if (start instanceof StartWhen) {
-                StartWhen startWhen = (StartWhen) start;
-                StartChoose startChoose = (StartChoose) stack.peek();
-                if (startChoose.getFirstChoice() != null) {
-                    StartWhen w = startChoose.getFirstChoice();
-                    while (w.getNextChoice() != null) {
-                        w = w.getNextChoice();
-                    }
-                    w.setNextChoice(startWhen);
-                } else {
-                    startChoose.setFirstChoice(startWhen);
-                }
-            } else if (start instanceof StartOtherwise) {
-                StartOtherwise startOtherwise = (StartOtherwise) start;
-                StartChoose startChoose = (StartChoose) stack.peek();
-                startChoose.setOtherwise(startOtherwise);
-            }
-        } else {
-            StartElement startElement = (StartElement) start;
-            newEvent = new EndElement(locator, startElement);
-            startElement.setEndElement((EndElement) newEvent);
-        }
-        addEvent(newEvent);
-        if (start instanceof StartDefine) {
-            StartDefine startDefine = (StartDefine) start;
-            startDefine.finish();
-        }
-    }
-
-    public void endPrefixMapping(String prefix) throws SAXException {
-        EndPrefixMapping endPrefixMapping = new EndPrefixMapping(locator,
-                prefix);
-        addEvent(endPrefixMapping);
-    }
-
-    public void ignorableWhitespace(char[] ch, int start, int length)
-            throws SAXException {
-        Event ev = new IgnorableWhitespace(locator, ch, start, length);
-        addEvent(ev);
-    }
-
-    public void processingInstruction(String target, String data)
-            throws SAXException {
-        Event pi = new ProcessingInstruction(locator, target, data);
-        addEvent(pi);
-    }
-
-    public void setDocumentLocator(Locator locator) {
-        this.locator = locator;
-    }
-
-    public void skippedEntity(String name) throws SAXException {
-        addEvent(new SkippedEntity(locator, name));
-    }
-
-    public void startDocument() {
-        startEvent = new StartDocument(locator);
-        lastEvent = startEvent;
-        stack.push(lastEvent);
-    }
-
-    public void startElement(String namespaceURI, String localName,
-            String qname, Attributes attrs) throws SAXException {
-        Event newEvent = null;
-        AttributesImpl elementAttributes = new AttributesImpl(attrs);
-        int attributeCount = elementAttributes.getLength();
-        for (int i = 0; i < attributeCount; i++) {
-            String attributeURI = elementAttributes.getURI(i);
-            if (StringUtils.equals(attributeURI, JXTemplateGenerator.NS)) {
-                getStartEvent().getTemplateProperties().put(
-                        elementAttributes.getLocalName(i),
-                        compileExpr(elementAttributes.getValue(i), null,
-                                locator));
-                elementAttributes.removeAttribute(i--);
-            }
-        }
-        StartElement startElement = new StartElement(locator, namespaceURI,
-                localName, qname, elementAttributes);
-        if (JXTemplateGenerator.NS.equals(namespaceURI)) {
-            if (localName.equals(FOR_EACH)) {
-                String items = attrs.getValue("items");
-                String select = attrs.getValue("select");
-                JXTExpression begin = compileInt(attrs.getValue("begin"),
-                        FOR_EACH, locator);
-                JXTExpression end = compileInt(attrs.getValue("end"), FOR_EACH,
-                        locator);
-                JXTExpression step = compileInt(attrs.getValue("step"),
-                        FOR_EACH, locator);
-                JXTExpression var = compileExpr(attrs.getValue("var"), null,
-                        locator);
-                JXTExpression varStatus = compileExpr(attrs
-                        .getValue("varStatus"), null, locator);
-                if (items == null) {
-                    if (select == null && (begin == null || end == null)) {
-                        throw new SAXParseException(
-                                "forEach: \"select\", \"items\", or both \"begin\" and \"end\" must be specified",
-                                locator, null);
-                    }
-                } else if (select != null) {
-                    throw new SAXParseException(
-                            "forEach: only one of \"select\" or \"items\" may be specified",
-                            locator, null);
-                }
-                JXTExpression 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, varStatus, begin, end, step, lenient);
-                newEvent = startForEach;
-            } else if (localName.equals(FORMAT_NUMBER)) {
-                JXTExpression value = compileExpr(attrs.getValue("value"),
-                        null, locator);
-                JXTExpression type = compileExpr(attrs.getValue("type"), null,
-                        locator);
-                JXTExpression pattern = compileExpr(attrs.getValue("pattern"),
-                        null, locator);
-                JXTExpression currencyCode = compileExpr(attrs
-                        .getValue("currencyCode"), null, locator);
-                JXTExpression currencySymbol = compileExpr(attrs
-                        .getValue("currencySymbol"), null, locator);
-                JXTExpression isGroupingUsed = compileBoolean(attrs
-                        .getValue("isGroupingUsed"), null, locator);
-                JXTExpression maxIntegerDigits = compileInt(attrs
-                        .getValue("maxIntegerDigits"), null, locator);
-                JXTExpression minIntegerDigits = compileInt(attrs
-                        .getValue("minIntegerDigits"), null, locator);
-                JXTExpression maxFractionDigits = compileInt(attrs
-                        .getValue("maxFractionDigits"), null, locator);
-                JXTExpression minFractionDigits = compileInt(attrs
-                        .getValue("minFractionDigits"), null, locator);
-                JXTExpression var = compileExpr(attrs.getValue("var"), null,
-                        locator);
-                JXTExpression locale = compileExpr(attrs.getValue("locale"),
-                        null, locator);
-                StartFormatNumber startFormatNumber = new StartFormatNumber(
-                        startElement, var, value, type, pattern, currencyCode,
-                        currencySymbol, isGroupingUsed, maxIntegerDigits,
-                        minIntegerDigits, maxFractionDigits, minFractionDigits,
-                        locale);
-                newEvent = startFormatNumber;
-            } else if (localName.equals(FORMAT_DATE)) {
-                JXTExpression var = compileExpr(attrs.getValue("var"), null,
-                        locator);
-                JXTExpression value = compileExpr(attrs.getValue("value"),
-                        null, locator);
-                JXTExpression type = compileExpr(attrs.getValue("type"), null,
-                        locator);
-                JXTExpression pattern = compileExpr(attrs.getValue("pattern"),
-                        null, locator);
-                JXTExpression timeZone = compileExpr(
-                        attrs.getValue("timeZone"), null, locator);
-                JXTExpression dateStyle = compileExpr(attrs
-                        .getValue("dateStyle"), null, locator);
-                JXTExpression timeStyle = compileExpr(attrs
-                        .getValue("timeStyle"), null, locator);
-                JXTExpression locale = compileExpr(attrs.getValue("locale"),
-                        null, locator);
-                StartFormatDate startFormatDate = new StartFormatDate(
-                        startElement, var, value, type, pattern, timeZone,
-                        dateStyle, timeStyle, locale);
-                newEvent = startFormatDate;
-            } else if (localName.equals(CHOOSE)) {
-                StartChoose startChoose = new StartChoose(startElement);
-                newEvent = startChoose;
-            } else if (localName.equals(WHEN)) {
-                if (stack.size() == 0 || !(stack.peek() instanceof StartChoose)) {
-                    throw new SAXParseException(
-                            "<when> must be within <choose>", locator, null);
-                }
-                String test = attrs.getValue("test");
-                if (test != null) {
-                    JXTExpression expr = compileExpr(test, "when: \"test\": ",
-                            locator);
-                    StartWhen startWhen = new StartWhen(startElement, expr);
-                    newEvent = startWhen;
-                } else {
-                    throw new SAXParseException("when: \"test\" is required",
-                            locator, null);
-                }
-            } else if (localName.equals(OUT)) {
-                String value = attrs.getValue("value");
-                if (value != null) {
-                    JXTExpression expr = compileExpr(value, "out: \"value\": ",
-                            locator);
-                    String lenientValue = attrs.getValue("lenient");
-                    Boolean lenient = lenientValue == null ? null : Boolean
-                            .valueOf(lenientValue);
-                    newEvent = new StartOut(startElement, expr, lenient);
-                } else {
-                    throw new SAXParseException("out: \"value\" is required",
-                            locator, null);
-                }
-            } else if (localName.equals(OTHERWISE)) {
-                if (stack.size() != 0 && (stack.peek() instanceof StartChoose)) {
-                    StartOtherwise startOtherwise = new StartOtherwise(
-                            startElement);
-                    newEvent = startOtherwise;
-                } else {
-                    throw new SAXParseException(
-                            "<otherwise> must be within <choose>", locator,
-                            null);
-                }
-            } else if (localName.equals(IF)) {
-                String test = attrs.getValue("test");
-                if (test != null) {
-                    JXTExpression expr = compileExpr(test, "if: \"test\": ",
-                            locator);
-                    StartIf startIf = new StartIf(startElement, expr);
-                    newEvent = startIf;
-                } else {
-                    throw new SAXParseException("if: \"test\" is required",
-                            locator, null);
-                }
-            } else if (localName.equals(MACRO)) {
-                // <macro name="myTag" targetNamespace="myNamespace">
-                // <parameter name="paramName" required="Boolean"
-                // default="value"/>
-                // body
-                // </macro>
-                String namespace = StringUtils.defaultString(attrs
-                        .getValue("targetNamespace"));
-                String name = attrs.getValue("name");
-                if (name != null) {
-                    StartDefine startDefine = new StartDefine(startElement,
-                            namespace, name);
-                    newEvent = startDefine;
-                } else {
-                    throw new SAXParseException("macro: \"name\" is required",
-                            locator, null);
-                }
-            } else if (localName.equals(PARAMETER)) {
-                if (stack.size() == 0 || !(stack.peek() instanceof StartDefine)) {
-                    throw new SAXParseException("<parameter> not allowed here",
-                            locator, null);
-                } else {
-                    String name = attrs.getValue("name");
-                    String optional = attrs.getValue("optional");
-                    String default_ = attrs.getValue("default");
-                    if (name != null) {
-                        StartParameter startParameter = new StartParameter(
-                                startElement, name, optional, default_);
-                        newEvent = startParameter;
-                    } else {
-                        throw new SAXParseException(
-                                "parameter: \"name\" is required", locator,
-                                null);
-                    }
-                }
-            } else if (localName.equals(EVALBODY)) {
-                newEvent = new StartEvalBody(startElement);
-            } else if (localName.equals(EVAL)) {
-                String value = attrs.getValue("select");
-                JXTExpression valueExpr = compileExpr(value,
-                        "eval: \"select\":", locator);
-                newEvent = new StartEval(startElement, valueExpr);
-            } else if (localName.equals(SET)) {
-                String var = attrs.getValue("var");
-                String value = attrs.getValue("value");
-                JXTExpression varExpr = null;
-                JXTExpression valueExpr = null;
-                if (var != null) {
-                    varExpr = compileExpr(var, "set: \"var\":", locator);
-                }
-                if (value != null) {
-                    valueExpr = compileExpr(value, "set: \"value\":", locator);
-                }
-                StartSet startSet = new StartSet(startElement, varExpr,
-                        valueExpr);
-                newEvent = startSet;
-            } else if (localName.equals(IMPORT)) {
-                // <import uri="${root}/foo/bar.xml" context="${foo}"/>
-                AttributeEvent uri = null;
-                Iterator iter = startElement.getAttributeEvents().iterator();
-                while (iter.hasNext()) {
-                    AttributeEvent e = (AttributeEvent) iter.next();
-                    if (e.getLocalName().equals("uri")) {
-                        uri = e;
-                        break;
-                    }
-                }
-                if (uri != null) {
-                    // If "context" is present then its value will be used
-                    // as the context object in the imported template
-                    String select = attrs.getValue("context");
-                    JXTExpression expr = null;
-                    if (select != null) {
-                        expr = compileExpr(select, "import: \"context\": ",
-                                locator);
-                    }
-                    StartImport startImport = new StartImport(startElement,
-                            uri, expr);
-                    newEvent = startImport;
-                } else {
-                    throw new SAXParseException("import: \"uri\" is required",
-                            locator, null);
-                }
-            } else if (localName.equals(TEMPLATE)) {
-                StartTemplate startTemplate = new StartTemplate(startElement);
-                newEvent = startTemplate;
-            } else if (localName.equals(COMMENT)) {
-                // <jx:comment>This will be parsed</jx:comment>
-                StartComment startJXComment = new StartComment(startElement);
-                newEvent = startJXComment;
-            } else {
-                throw new SAXParseException("unrecognized tag: " + localName,
-                        locator, null);
-            }
-        } else {
-            newEvent = startElement;
-        }
-        stack.push(newEvent);
-        addEvent(newEvent);
-    }
-
-    public void startPrefixMapping(String prefix, String uri)
-            throws SAXException {
-        addEvent(new StartPrefixMapping(locator, prefix, uri));
-    }
-
-    public void comment(char ch[], int start, int length) throws SAXException {
-        //DO NOTHING
-    }
-
-    public void endCDATA() throws SAXException {
-        addEvent(new EndCDATA(locator));
-    }
-
-    public void endDTD() throws SAXException {
-        addEvent(new EndDTD(locator));
-    }
-
-    public void endEntity(String name) throws SAXException {
-        addEvent(new EndEntity(locator, name));
-    }
-
-    public void startCDATA() throws SAXException {
-        addEvent(new StartCDATA(locator));
-    }
-
-    public void startDTD(String name, String publicId, String systemId)
-            throws SAXException {
-        addEvent(new StartDTD(locator, name, publicId, systemId));
-    }
-
-    public void startEntity(String name) throws SAXException {
-        addEvent(new StartEntity(locator, name));
-    }
-
-    public static JXTExpression compile(final String variable, boolean xpath)
-            throws Exception {
-        Object compiled;
-        if (xpath) {
-            compiled = JXPathContext.compile(variable);
-        } else {
-            compiled = ExpressionFactory.createExpression(variable);
-        }
-        return new JXTExpression(variable, compiled);
-    }
-
-    public static JXTExpression compileBoolean(String val, String msg,
-            Locator location) throws SAXException {
-        JXTExpression res = compileExpr(val, msg, location);
-        if (res != null) {
-            if (res.getCompiledExpression() == null) {
-                res.setCompiledExpression(Boolean.valueOf(res.getRaw()));
-            }
-            return res;
-        }
-        return null;
-    }
-
-    /*
-     * Compile an integer expression (returns either a Compiled Expression or an
-     * Integer literal)
-     */
-    public static JXTExpression compileInt(String val, String msg,
-            Locator location) throws SAXException {
-        JXTExpression res = compileExpr(val, msg, location);
-        if (res != null) {
-            if (res.getCompiledExpression() == null) {
-                res.setCompiledExpression(Integer.valueOf(res.getRaw()));
-            }
-            return res;
-        }
-        return null;
-    }
-
-    public static JXTExpression compileExpr(String inStr) throws Exception {
-        try {
-            if (inStr == null) {
-                return null;
-            }
-            StringReader in = new StringReader(inStr.trim());
-            int ch;
-            boolean xpath = false;
-            boolean inExpr = false;
-            StringBuffer expr = new StringBuffer();
-            while ((ch = in.read()) != -1) {
-                char c = (char) ch;
-                if (inExpr) {
-                    if (c == '\\') {
-                        ch = in.read();
-                        expr.append((ch == -1) ? '\\' : (char) ch);
-                    } else if (c == '}') {
-                        return compile(expr.toString(), xpath);
-                    } else {
-                        expr.append(c);
-                    }
-                } else {
-                    if (c == '$' || c == '#') {
-                        ch = in.read();
-                        if (ch == '{') {
-                            inExpr = true;
-                            xpath = c == '#';
-                            continue;
-                        }
-                    }
-                    // hack: invalid expression?
-                    // just return the original and swallow exception
-                    return new JXTExpression(inStr, null);
-                }
-            }
-            if (inExpr) {
-                // unclosed #{} or ${}
-                throw new Exception("Unterminated " + (xpath ? "#" : "$") + "{");
-            }
-        } catch (IOException ignored) {
-            ignored.printStackTrace();
-        }
-        return new JXTExpression(inStr, null);
-    }
-
-    /**
-     * Compile a single Jexl expr (contained in ${}) or XPath expression
-     * (contained in #{})
-     */
-
-    public static JXTExpression compileExpr(String expr, String errorPrefix,
-            Locator location) throws SAXParseException {
-        try {
-            return compileExpr(expr);
-        } catch (Exception exc) {
-            throw new SAXParseException(errorPrefix + exc.getMessage(),
-                    location, exc);
-        } catch (Error err) {
-            throw new SAXParseException(errorPrefix + err.getMessage(),
-                    location, new ErrorHolder(err));
-        }
-    }
+/*
+ * 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.cocoon.template.jxtg.script;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.Iterator;
+import java.util.Stack;
+
+import org.apache.cocoon.template.jxtg.JXTemplateGenerator;
+import org.apache.cocoon.template.jxtg.environment.ErrorHolder;
+import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+import org.apache.cocoon.template.jxtg.script.event.*;
+import org.apache.commons.jexl.ExpressionFactory;
+import org.apache.commons.jxpath.JXPathContext;
+import org.apache.commons.lang.StringUtils;
+import org.xml.sax.Attributes;
+import org.xml.sax.ContentHandler;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.ext.LexicalHandler;
+import org.xml.sax.helpers.AttributesImpl;
+import org.xml.sax.helpers.LocatorImpl;
+
+public class Parser implements ContentHandler, LexicalHandler {
+
+    StartDocument startEvent;
+    Event lastEvent;
+    Stack stack = new Stack();
+    Locator locator;
+    Locator charLocation;
+    StringBuffer charBuf;
+
+    final static String TEMPLATE = "template";
+    final static String FOR_EACH = "forEach";
+    final static String IF = "if";
+    final static String CHOOSE = "choose";
+    final static String WHEN = "when";
+    final static String OTHERWISE = "otherwise";
+    final static String OUT = "out";
+    final static String IMPORT = "import";
+    final static String SET = "set";
+    final static String MACRO = "macro";
+    final static String EVALBODY = "evalBody";
+    final static String EVAL = "eval";
+    final static String PARAMETER = "parameter";
+    final static String FORMAT_NUMBER = "formatNumber";
+    final static String FORMAT_DATE = "formatDate";
+    final static String COMMENT = "comment";
+
+    public Parser() {
+        // EMPTY
+    }
+
+    public StartDocument getStartEvent() {
+        return this.startEvent;
+    }
+
+    protected void recycle() {
+        startEvent = null;
+        lastEvent = null;
+        stack.clear();
+        locator = null;
+        charLocation = null;
+        charBuf = null;
+    }
+
+    private void addEvent(Event ev) throws SAXException {
+        if (ev != null) {
+            if (lastEvent == null) {
+                lastEvent = startEvent = new StartDocument(locator);
+            } else {
+                flushChars();
+            }
+            lastEvent.setNext(ev);
+            lastEvent = ev;
+        } else {
+            throw new NullPointerException("null event");
+        }
+    }
+
+    void flushChars() throws SAXException {
+        if (charBuf != null) {
+            char[] chars = new char[charBuf.length()];
+            charBuf.getChars(0, charBuf.length(), chars, 0);
+            Characters ev = new Characters(charLocation, chars, 0, chars.length);
+            lastEvent.setNext(ev);
+            lastEvent = ev;
+            charLocation = null;
+            charBuf = null;
+        }
+    }
+
+    public void characters(char[] ch, int start, int length)
+            throws SAXException {
+        if (charBuf == null) {
+            charBuf = new StringBuffer(length);
+            charLocation = locator != null ? new LocatorImpl(locator)
+                    : JXTemplateGenerator.NULL_LOCATOR;
+        }
+        charBuf.append(ch, start, length);
+    }
+
+    public void endDocument() throws SAXException {
+        StartDocument startDoc = (StartDocument) stack.pop();
+        EndDocument endDoc = new EndDocument(locator);
+        startDoc.setEndDocument(endDoc);
+        addEvent(endDoc);
+    }
+
+    public void endElement(String namespaceURI, String localName, String raw)
+            throws SAXException {
+        Event start = (Event) stack.pop();
+        Event newEvent = null;
+        if (JXTemplateGenerator.NS.equals(namespaceURI)) {
+            StartInstruction startInstruction = (StartInstruction) start;
+            EndInstruction endInstruction = new EndInstruction(locator,
+                    startInstruction);
+            newEvent = endInstruction;
+            if (start instanceof StartWhen) {
+                StartWhen startWhen = (StartWhen) start;
+                StartChoose startChoose = (StartChoose) stack.peek();
+                if (startChoose.getFirstChoice() != null) {
+                    StartWhen w = startChoose.getFirstChoice();
+                    while (w.getNextChoice() != null) {
+                        w = w.getNextChoice();
+                    }
+                    w.setNextChoice(startWhen);
+                } else {
+                    startChoose.setFirstChoice(startWhen);
+                }
+            } else if (start instanceof StartOtherwise) {
+                StartOtherwise startOtherwise = (StartOtherwise) start;
+                StartChoose startChoose = (StartChoose) stack.peek();
+                startChoose.setOtherwise(startOtherwise);
+            }
+        } else {
+            StartElement startElement = (StartElement) start;
+            newEvent = new EndElement(locator, startElement);
+            startElement.setEndElement((EndElement) newEvent);
+        }
+        addEvent(newEvent);
+        if (start instanceof StartDefine) {
+            StartDefine startDefine = (StartDefine) start;
+            startDefine.finish();
+        }
+    }
+
+    public void endPrefixMapping(String prefix) throws SAXException {
+        EndPrefixMapping endPrefixMapping = new EndPrefixMapping(locator,
+                prefix);
+        addEvent(endPrefixMapping);
+    }
+
+    public void ignorableWhitespace(char[] ch, int start, int length)
+            throws SAXException {
+        Event ev = new IgnorableWhitespace(locator, ch, start, length);
+        addEvent(ev);
+    }
+
+    public void processingInstruction(String target, String data)
+            throws SAXException {
+        Event pi = new ProcessingInstruction(locator, target, data);
+        addEvent(pi);
+    }
+
+    public void setDocumentLocator(Locator locator) {
+        this.locator = locator;
+    }
+
+    public void skippedEntity(String name) throws SAXException {
+        addEvent(new SkippedEntity(locator, name));
+    }
+
+    public void startDocument() {
+        startEvent = new StartDocument(locator);
+        lastEvent = startEvent;
+        stack.push(lastEvent);
+    }
+
+    public void startElement(String namespaceURI, String localName,
+            String qname, Attributes attrs) throws SAXException {
+        Event newEvent = null;
+        AttributesImpl elementAttributes = new AttributesImpl(attrs);
+        int attributeCount = elementAttributes.getLength();
+        for (int i = 0; i < attributeCount; i++) {
+            String attributeURI = elementAttributes.getURI(i);
+            if (StringUtils.equals(attributeURI, JXTemplateGenerator.NS)) {
+                getStartEvent().getTemplateProperties().put(
+                        elementAttributes.getLocalName(i),
+                        compileExpr(elementAttributes.getValue(i), null,
+                                locator));
+                elementAttributes.removeAttribute(i--);
+            }
+        }
+        StartElement startElement = new StartElement(locator, namespaceURI,
+                localName, qname, elementAttributes);
+        if (JXTemplateGenerator.NS.equals(namespaceURI)) {
+            if (localName.equals(FOR_EACH)) {
+                String items = attrs.getValue("items");
+                String select = attrs.getValue("select");
+                JXTExpression begin = compileInt(attrs.getValue("begin"),
+                        FOR_EACH, locator);
+                JXTExpression end = compileInt(attrs.getValue("end"), FOR_EACH,
+                        locator);
+                JXTExpression step = compileInt(attrs.getValue("step"),
+                        FOR_EACH, locator);
+                JXTExpression var = compileExpr(attrs.getValue("var"), null,
+                        locator);
+                JXTExpression varStatus = compileExpr(attrs
+                        .getValue("varStatus"), null, locator);
+                if (items == null) {
+                    if (select == null && (begin == null || end == null)) {
+                        throw new SAXParseException(
+                                "forEach: \"select\", \"items\", or both \"begin\" and \"end\" must be specified",
+                                locator, null);
+                    }
+                } else if (select != null) {
+                    throw new SAXParseException(
+                            "forEach: only one of \"select\" or \"items\" may be specified",
+                            locator, null);
+                }
+                JXTExpression 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, varStatus, begin, end, step, lenient);
+                newEvent = startForEach;
+            } else if (localName.equals(FORMAT_NUMBER)) {
+                JXTExpression value = compileExpr(attrs.getValue("value"),
+                        null, locator);
+                JXTExpression type = compileExpr(attrs.getValue("type"), null,
+                        locator);
+                JXTExpression pattern = compileExpr(attrs.getValue("pattern"),
+                        null, locator);
+                JXTExpression currencyCode = compileExpr(attrs
+                        .getValue("currencyCode"), null, locator);
+                JXTExpression currencySymbol = compileExpr(attrs
+                        .getValue("currencySymbol"), null, locator);
+                JXTExpression isGroupingUsed = compileBoolean(attrs
+                        .getValue("isGroupingUsed"), null, locator);
+                JXTExpression maxIntegerDigits = compileInt(attrs
+                        .getValue("maxIntegerDigits"), null, locator);
+                JXTExpression minIntegerDigits = compileInt(attrs
+                        .getValue("minIntegerDigits"), null, locator);
+                JXTExpression maxFractionDigits = compileInt(attrs
+                        .getValue("maxFractionDigits"), null, locator);
+                JXTExpression minFractionDigits = compileInt(attrs
+                        .getValue("minFractionDigits"), null, locator);
+                JXTExpression var = compileExpr(attrs.getValue("var"), null,
+                        locator);
+                JXTExpression locale = compileExpr(attrs.getValue("locale"),
+                        null, locator);
+                StartFormatNumber startFormatNumber = new StartFormatNumber(
+                        startElement, var, value, type, pattern, currencyCode,
+                        currencySymbol, isGroupingUsed, maxIntegerDigits,
+                        minIntegerDigits, maxFractionDigits, minFractionDigits,
+                        locale);
+                newEvent = startFormatNumber;
+            } else if (localName.equals(FORMAT_DATE)) {
+                JXTExpression var = compileExpr(attrs.getValue("var"), null,
+                        locator);
+                JXTExpression value = compileExpr(attrs.getValue("value"),
+                        null, locator);
+                JXTExpression type = compileExpr(attrs.getValue("type"), null,
+                        locator);
+                JXTExpression pattern = compileExpr(attrs.getValue("pattern"),
+                        null, locator);
+                JXTExpression timeZone = compileExpr(
+                        attrs.getValue("timeZone"), null, locator);
+                JXTExpression dateStyle = compileExpr(attrs
+                        .getValue("dateStyle"), null, locator);
+                JXTExpression timeStyle = compileExpr(attrs
+                        .getValue("timeStyle"), null, locator);
+                JXTExpression locale = compileExpr(attrs.getValue("locale"),
+                        null, locator);
+                StartFormatDate startFormatDate = new StartFormatDate(
+                        startElement, var, value, type, pattern, timeZone,
+                        dateStyle, timeStyle, locale);
+                newEvent = startFormatDate;
+            } else if (localName.equals(CHOOSE)) {
+                StartChoose startChoose = new StartChoose(startElement);
+                newEvent = startChoose;
+            } else if (localName.equals(WHEN)) {
+                if (stack.size() == 0 || !(stack.peek() instanceof StartChoose)) {
+                    throw new SAXParseException(
+                            "<when> must be within <choose>", locator, null);
+                }
+                String test = attrs.getValue("test");
+                if (test != null) {
+                    JXTExpression expr = compileExpr(test, "when: \"test\": ",
+                            locator);
+                    StartWhen startWhen = new StartWhen(startElement, expr);
+                    newEvent = startWhen;
+                } else {
+                    throw new SAXParseException("when: \"test\" is required",
+                            locator, null);
+                }
+            } else if (localName.equals(OUT)) {
+                String value = attrs.getValue("value");
+                if (value != null) {
+                    JXTExpression expr = compileExpr(value, "out: \"value\": ",
+                            locator);
+                    String lenientValue = attrs.getValue("lenient");
+                    Boolean lenient = lenientValue == null ? null : Boolean
+                            .valueOf(lenientValue);
+                    newEvent = new StartOut(startElement, expr, lenient);
+                } else {
+                    throw new SAXParseException("out: \"value\" is required",
+                            locator, null);
+                }
+            } else if (localName.equals(OTHERWISE)) {
+                if (stack.size() != 0 && (stack.peek() instanceof StartChoose)) {
+                    StartOtherwise startOtherwise = new StartOtherwise(
+                            startElement);
+                    newEvent = startOtherwise;
+                } else {
+                    throw new SAXParseException(
+                            "<otherwise> must be within <choose>", locator,
+                            null);
+                }
+            } else if (localName.equals(IF)) {
+                String test = attrs.getValue("test");
+                if (test != null) {
+                    JXTExpression expr = compileExpr(test, "if: \"test\": ",
+                            locator);
+                    StartIf startIf = new StartIf(startElement, expr);
+                    newEvent = startIf;
+                } else {
+                    throw new SAXParseException("if: \"test\" is required",
+                            locator, null);
+                }
+            } else if (localName.equals(MACRO)) {
+                // <macro name="myTag" targetNamespace="myNamespace">
+                // <parameter name="paramName" required="Boolean"
+                // default="value"/>
+                // body
+                // </macro>
+                String namespace = StringUtils.defaultString(attrs
+                        .getValue("targetNamespace"));
+                String name = attrs.getValue("name");
+                if (name != null) {
+                    StartDefine startDefine = new StartDefine(startElement,
+                            namespace, name);
+                    newEvent = startDefine;
+                } else {
+                    throw new SAXParseException("macro: \"name\" is required",
+                            locator, null);
+                }
+            } else if (localName.equals(PARAMETER)) {
+                if (stack.size() == 0 || !(stack.peek() instanceof StartDefine)) {
+                    throw new SAXParseException("<parameter> not allowed here",
+                            locator, null);
+                } else {
+                    String name = attrs.getValue("name");
+                    String optional = attrs.getValue("optional");
+                    String default_ = attrs.getValue("default");
+                    if (name != null) {
+                        StartParameter startParameter = new StartParameter(
+                                startElement, name, optional, default_);
+                        newEvent = startParameter;
+                    } else {
+                        throw new SAXParseException(
+                                "parameter: \"name\" is required", locator,
+                                null);
+                    }
+                }
+            } else if (localName.equals(EVALBODY)) {
+                newEvent = new StartEvalBody(startElement);
+            } else if (localName.equals(EVAL)) {
+                String value = attrs.getValue("select");
+                JXTExpression valueExpr = compileExpr(value,
+                        "eval: \"select\":", locator);
+                newEvent = new StartEval(startElement, valueExpr);
+            } else if (localName.equals(SET)) {
+                String var = attrs.getValue("var");
+                String value = attrs.getValue("value");
+                JXTExpression varExpr = null;
+                JXTExpression valueExpr = null;
+                if (var != null) {
+                    varExpr = compileExpr(var, "set: \"var\":", locator);
+                }
+                if (value != null) {
+                    valueExpr = compileExpr(value, "set: \"value\":", locator);
+                }
+                StartSet startSet = new StartSet(startElement, varExpr,
+                        valueExpr);
+                newEvent = startSet;
+            } else if (localName.equals(IMPORT)) {
+                // <import uri="${root}/foo/bar.xml" context="${foo}"/>
+                AttributeEvent uri = null;
+                Iterator iter = startElement.getAttributeEvents().iterator();
+                while (iter.hasNext()) {
+                    AttributeEvent e = (AttributeEvent) iter.next();
+                    if (e.getLocalName().equals("uri")) {
+                        uri = e;
+                        break;
+                    }
+                }
+                if (uri != null) {
+                    // If "context" is present then its value will be used
+                    // as the context object in the imported template
+                    String select = attrs.getValue("context");
+                    JXTExpression expr = null;
+                    if (select != null) {
+                        expr = compileExpr(select, "import: \"context\": ",
+                                locator);
+                    }
+                    StartImport startImport = new StartImport(startElement,
+                            uri, expr);
+                    newEvent = startImport;
+                } else {
+                    throw new SAXParseException("import: \"uri\" is required",
+                            locator, null);
+                }
+            } else if (localName.equals(TEMPLATE)) {
+                StartTemplate startTemplate = new StartTemplate(startElement);
+                newEvent = startTemplate;
+            } else if (localName.equals(COMMENT)) {
+                // <jx:comment>This will be parsed</jx:comment>
+                StartComment startJXComment = new StartComment(startElement);
+                newEvent = startJXComment;
+            } else {
+                throw new SAXParseException("unrecognized tag: " + localName,
+                        locator, null);
+            }
+        } else {
+            newEvent = startElement;
+        }
+        stack.push(newEvent);
+        addEvent(newEvent);
+    }
+
+    public void startPrefixMapping(String prefix, String uri)
+            throws SAXException {
+        addEvent(new StartPrefixMapping(locator, prefix, uri));
+    }
+
+    public void comment(char ch[], int start, int length) throws SAXException {
+        //DO NOTHING
+    }
+
+    public void endCDATA() throws SAXException {
+        addEvent(new EndCDATA(locator));
+    }
+
+    public void endDTD() throws SAXException {
+        addEvent(new EndDTD(locator));
+    }
+
+    public void endEntity(String name) throws SAXException {
+        addEvent(new EndEntity(locator, name));
+    }
+
+    public void startCDATA() throws SAXException {
+        addEvent(new StartCDATA(locator));
+    }
+
+    public void startDTD(String name, String publicId, String systemId)
+            throws SAXException {
+        addEvent(new StartDTD(locator, name, publicId, systemId));
+    }
+
+    public void startEntity(String name) throws SAXException {
+        addEvent(new StartEntity(locator, name));
+    }
+
+    public static JXTExpression compile(final String variable, boolean xpath)
+            throws Exception {
+        Object compiled;
+        if (xpath) {
+            compiled = JXPathContext.compile(variable);
+        } else {
+            compiled = ExpressionFactory.createExpression(variable);
+        }
+        return new JXTExpression(variable, compiled);
+    }
+
+    public static JXTExpression compileBoolean(String val, String msg,
+            Locator location) throws SAXException {
+        JXTExpression res = compileExpr(val, msg, location);
+        if (res != null) {
+            if (res.getCompiledExpression() == null) {
+                res.setCompiledExpression(Boolean.valueOf(res.getRaw()));
+            }
+            return res;
+        }
+        return null;
+    }
+
+    /*
+     * Compile an integer expression (returns either a Compiled Expression or an
+     * Integer literal)
+     */
+    public static JXTExpression compileInt(String val, String msg,
+            Locator location) throws SAXException {
+        JXTExpression res = compileExpr(val, msg, location);
+        if (res != null) {
+            if (res.getCompiledExpression() == null) {
+                res.setCompiledExpression(Integer.valueOf(res.getRaw()));
+            }
+            return res;
+        }
+        return null;
+    }
+
+    public static JXTExpression compileExpr(String inStr) throws Exception {
+        try {
+            if (inStr == null) {
+                return null;
+            }
+            StringReader in = new StringReader(inStr.trim());
+            int ch;
+            boolean xpath = false;
+            boolean inExpr = false;
+            StringBuffer expr = new StringBuffer();
+            while ((ch = in.read()) != -1) {
+                char c = (char) ch;
+                if (inExpr) {
+                    if (c == '\\') {
+                        ch = in.read();
+                        expr.append((ch == -1) ? '\\' : (char) ch);
+                    } else if (c == '}') {
+                        return compile(expr.toString(), xpath);
+                    } else {
+                        expr.append(c);
+                    }
+                } else {
+                    if (c == '$' || c == '#') {
+                        ch = in.read();
+                        if (ch == '{') {
+                            inExpr = true;
+                            xpath = c == '#';
+                            continue;
+                        }
+                    }
+                    // hack: invalid expression?
+                    // just return the original and swallow exception
+                    return new JXTExpression(inStr, null);
+                }
+            }
+            if (inExpr) {
+                // unclosed #{} or ${}
+                throw new Exception("Unterminated " + (xpath ? "#" : "$") + "{");
+            }
+        } catch (IOException ignored) {
+            ignored.printStackTrace();
+        }
+        return new JXTExpression(inStr, null);
+    }
+
+    /**
+     * Compile a single Jexl expr (contained in ${}) or XPath expression
+     * (contained in #{})
+     */
+
+    public static JXTExpression compileExpr(String expr, String errorPrefix,
+            Locator location) throws SAXParseException {
+        try {
+            return compileExpr(expr);
+        } catch (Exception exc) {
+            throw new SAXParseException(errorPrefix + exc.getMessage(),
+                    location, exc);
+        } catch (Error err) {
+            throw new SAXParseException(errorPrefix + err.getMessage(),
+                    location, new ErrorHolder(err));
+        }
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/AttributeEvent.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/AttributeEvent.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/AttributeEvent.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/AttributeEvent.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/AttributeEvent.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/AttributeEvent.java	Thu Dec  9 07:41:02 2004
@@ -1,48 +1,48 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-public abstract class AttributeEvent {
-    public AttributeEvent(String namespaceURI, String localName, String raw,
-            String type) {
-        this.namespaceURI = namespaceURI;
-        this.localName = localName;
-        this.raw = raw;
-        this.type = type;
-    }
-
-    final String namespaceURI;
-
-    public String getLocalName() {
-        return localName;
-    }
-
-    public String getNamespaceURI() {
-        return namespaceURI;
-    }
-
-    public String getRaw() {
-        return raw;
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    final String localName;
-    final String raw;
-    final String type;
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+public abstract class AttributeEvent {
+    public AttributeEvent(String namespaceURI, String localName, String raw,
+            String type) {
+        this.namespaceURI = namespaceURI;
+        this.localName = localName;
+        this.raw = raw;
+        this.type = type;
+    }
+
+    final String namespaceURI;
+
+    public String getLocalName() {
+        return localName;
+    }
+
+    public String getNamespaceURI() {
+        return namespaceURI;
+    }
+
+    public String getRaw() {
+        return raw;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    final String localName;
+    final String raw;
+    final String type;
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/Characters.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/Characters.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/Characters.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/Characters.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/Characters.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/Characters.java	Thu Dec  9 07:41:02 2004
@@ -1,26 +1,26 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-
-public class Characters extends TextEvent {
-    public Characters(Locator location, char[] chars, int start, int length)
-            throws SAXException {
-        super(location, chars, start, length);
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+
+public class Characters extends TextEvent {
+    public Characters(Locator location, char[] chars, int start, int length)
+            throws SAXException {
+        super(location, chars, start, length);
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/CopyAttribute.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/CopyAttribute.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/CopyAttribute.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/CopyAttribute.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/CopyAttribute.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/CopyAttribute.java	Thu Dec  9 07:41:02 2004
@@ -1,30 +1,30 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-public class CopyAttribute extends AttributeEvent {
-    public CopyAttribute(String namespaceURI, String localName, String raw,
-            String type, String value) {
-        super(namespaceURI, localName, raw, type);
-        this.value = value;
-    }
-
-    public String getValue() {
-        return value;
-    }
-
-    private final String value;
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+public class CopyAttribute extends AttributeEvent {
+    public CopyAttribute(String namespaceURI, String localName, String raw,
+            String type, String value) {
+        super(namespaceURI, localName, raw, type);
+        this.value = value;
+    }
+
+    public String getValue() {
+        return value;
+    }
+
+    private final String value;
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndCDATA.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndCDATA.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndCDATA.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndCDATA.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndCDATA.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndCDATA.java	Thu Dec  9 07:41:02 2004
@@ -1,24 +1,24 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.xml.sax.Locator;
-
-public class EndCDATA extends Event {
-    public EndCDATA(Locator location) {
-        super(location);
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.xml.sax.Locator;
+
+public class EndCDATA extends Event {
+    public EndCDATA(Locator location) {
+        super(location);
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndDTD.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndDTD.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndDTD.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndDTD.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndDTD.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndDTD.java	Thu Dec  9 07:41:02 2004
@@ -1,24 +1,24 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.xml.sax.Locator;
-
-public class EndDTD extends Event {
-    public EndDTD(Locator location) {
-        super(location);
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.xml.sax.Locator;
+
+public class EndDTD extends Event {
+    public EndDTD(Locator location) {
+        super(location);
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndDocument.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndDocument.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndDocument.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndDocument.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndDocument.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndDocument.java	Thu Dec  9 07:41:02 2004
@@ -1,24 +1,24 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.xml.sax.Locator;
-
-public class EndDocument extends Event {
-    public EndDocument(Locator location) {
-        super(location);
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.xml.sax.Locator;
+
+public class EndDocument extends Event {
+    public EndDocument(Locator location) {
+        super(location);
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndElement.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndElement.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndElement.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndElement.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndElement.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndElement.java	Thu Dec  9 07:41:02 2004
@@ -1,31 +1,31 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.xml.sax.Locator;
-
-public class EndElement extends Event {
-    public EndElement(Locator location, StartElement startElement) {
-        super(location);
-        this.startElement = startElement;
-    }
-
-    final StartElement startElement;
-
-    public StartElement getStartElement() {
-        return startElement;
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.xml.sax.Locator;
+
+public class EndElement extends Event {
+    public EndElement(Locator location, StartElement startElement) {
+        super(location);
+        this.startElement = startElement;
+    }
+
+    final StartElement startElement;
+
+    public StartElement getStartElement() {
+        return startElement;
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndEntity.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndEntity.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndEntity.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndEntity.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndEntity.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndEntity.java	Thu Dec  9 07:41:02 2004
@@ -1,31 +1,31 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.xml.sax.Locator;
-
-public class EndEntity extends Event {
-    public EndEntity(Locator location, String name) {
-        super(location);
-        this.name = name;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    private final String name;
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.xml.sax.Locator;
+
+public class EndEntity extends Event {
+    public EndEntity(Locator location, String name) {
+        super(location);
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    private final String name;
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndInstruction.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndInstruction.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndInstruction.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndInstruction.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndInstruction.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndInstruction.java	Thu Dec  9 07:41:02 2004
@@ -1,32 +1,32 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.xml.sax.Locator;
-
-public class EndInstruction extends Event {
-    public EndInstruction(Locator locator, StartInstruction startInstruction) {
-        super(locator);
-        this.startInstruction = startInstruction;
-        startInstruction.setEndInstruction(this);
-    }
-
-    final StartInstruction startInstruction;
-
-    public StartInstruction getStartInstruction() {
-        return startInstruction;
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.xml.sax.Locator;
+
+public class EndInstruction extends Event {
+    public EndInstruction(Locator locator, StartInstruction startInstruction) {
+        super(locator);
+        this.startInstruction = startInstruction;
+        startInstruction.setEndInstruction(this);
+    }
+
+    final StartInstruction startInstruction;
+
+    public StartInstruction getStartInstruction() {
+        return startInstruction;
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndPrefixMapping.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndPrefixMapping.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndPrefixMapping.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndPrefixMapping.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndPrefixMapping.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/EndPrefixMapping.java	Thu Dec  9 07:41:02 2004
@@ -1,31 +1,31 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.xml.sax.Locator;
-
-public class EndPrefixMapping extends Event {
-    public EndPrefixMapping(Locator location, String prefix) {
-        super(location);
-        this.prefix = prefix;
-    }
-
-    final String prefix;
-
-    public String getPrefix() {
-        return prefix;
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.xml.sax.Locator;
+
+public class EndPrefixMapping extends Event {
+    public EndPrefixMapping(Locator location, String prefix) {
+        super(location);
+        this.prefix = prefix;
+    }
+
+    final String prefix;
+
+    public String getPrefix() {
+        return prefix;
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/Event.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/Event.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/Event.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/Event.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/Event.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/Event.java	Thu Dec  9 07:41:02 2004
@@ -1,56 +1,56 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.apache.cocoon.template.jxtg.JXTemplateGenerator;
-import org.xml.sax.Locator;
-import org.xml.sax.helpers.LocatorImpl;
-
-public class Event {
-    protected final Locator location;
-    protected Event next; // in document order
-
-    public Event(Locator locator) {
-        this.location = locator != null ? new LocatorImpl(locator)
-                : JXTemplateGenerator.NULL_LOCATOR;
-    }
-
-    public final Locator getLocation() {
-        return location;
-    }
-
-    public Event getNext() {
-        return next;
-    }
-
-    public void setNext(Event next) {
-        this.next = next;
-    }
-
-    public String locationString() {
-        StringBuffer buf = new StringBuffer();
-        buf.append(location.getSystemId());
-        if (buf.length() > 0) {
-            buf.append(", ");
-        }
-        buf.append("Line " + location.getLineNumber());
-        int col = location.getColumnNumber();
-        if (col > 0) {
-            buf.append("." + col);
-        }
-        return buf.toString();
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.apache.cocoon.template.jxtg.JXTemplateGenerator;
+import org.xml.sax.Locator;
+import org.xml.sax.helpers.LocatorImpl;
+
+public class Event {
+    protected final Locator location;
+    protected Event next; // in document order
+
+    public Event(Locator locator) {
+        this.location = locator != null ? new LocatorImpl(locator)
+                : JXTemplateGenerator.NULL_LOCATOR;
+    }
+
+    public final Locator getLocation() {
+        return location;
+    }
+
+    public Event getNext() {
+        return next;
+    }
+
+    public void setNext(Event next) {
+        this.next = next;
+    }
+
+    public String locationString() {
+        StringBuffer buf = new StringBuffer();
+        buf.append(location.getSystemId());
+        if (buf.length() > 0) {
+            buf.append(", ");
+        }
+        buf.append("Line " + location.getLineNumber());
+        int col = location.getColumnNumber();
+        if (col > 0) {
+            buf.append("." + col);
+        }
+        return buf.toString();
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/IgnorableWhitespace.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/IgnorableWhitespace.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/IgnorableWhitespace.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/IgnorableWhitespace.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/IgnorableWhitespace.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/IgnorableWhitespace.java	Thu Dec  9 07:41:02 2004
@@ -1,26 +1,26 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-
-public class IgnorableWhitespace extends TextEvent {
-    public IgnorableWhitespace(Locator location, char[] chars, int start,
-            int length) throws SAXException {
-        super(location, chars, start, length);
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+
+public class IgnorableWhitespace extends TextEvent {
+    public IgnorableWhitespace(Locator location, char[] chars, int start,
+            int length) throws SAXException {
+        super(location, chars, start, length);
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/LoopTagStatus.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/LoopTagStatus.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/LoopTagStatus.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/LoopTagStatus.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/LoopTagStatus.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/LoopTagStatus.java	Thu Dec  9 07:41:02 2004
@@ -1,76 +1,76 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-
-public class LoopTagStatus {
-    private Object current;
-    private int index;
-    private int count;
-    private boolean first;
-    private boolean last;
-    private int begin;
-    private int end;
-    private int step;
-    public void setBegin(int begin) {
-        this.begin = begin;
-    }
-    public int getBegin() {
-        return begin;
-    }
-    public void setEnd(int end) {
-        this.end = end;
-    }
-    public int getEnd() {
-        return end;
-    }
-    public void setStep(int step) {
-        this.step = step;
-    }
-    public int getStep() {
-        return step;
-    }
-    public void setFirst(boolean first) {
-        this.first = first;
-    }
-    public boolean isFirst() {
-        return first;
-    }
-    public void setIndex(int index) {
-        this.index = index;
-    }
-    public int getIndex() {
-        return index;
-    }
-    public void setCount(int count) {
-        this.count = count;
-    }
-    public int getCount() {
-        return count;
-    }
-    public void setCurrent(Object current) {
-        this.current = current;
-    }
-    public Object getCurrent() {
-        return current;
-    }
-    public void setLast(boolean last) {
-        this.last = last;
-    }
-    public boolean isLast() {
-        return last;
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+
+public class LoopTagStatus {
+    private Object current;
+    private int index;
+    private int count;
+    private boolean first;
+    private boolean last;
+    private int begin;
+    private int end;
+    private int step;
+    public void setBegin(int begin) {
+        this.begin = begin;
+    }
+    public int getBegin() {
+        return begin;
+    }
+    public void setEnd(int end) {
+        this.end = end;
+    }
+    public int getEnd() {
+        return end;
+    }
+    public void setStep(int step) {
+        this.step = step;
+    }
+    public int getStep() {
+        return step;
+    }
+    public void setFirst(boolean first) {
+        this.first = first;
+    }
+    public boolean isFirst() {
+        return first;
+    }
+    public void setIndex(int index) {
+        this.index = index;
+    }
+    public int getIndex() {
+        return index;
+    }
+    public void setCount(int count) {
+        this.count = count;
+    }
+    public int getCount() {
+        return count;
+    }
+    public void setCurrent(Object current) {
+        this.current = current;
+    }
+    public Object getCurrent() {
+        return current;
+    }
+    public void setLast(boolean last) {
+        this.last = last;
+    }
+    public boolean isLast() {
+        return last;
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/ProcessingInstruction.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/ProcessingInstruction.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/ProcessingInstruction.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/ProcessingInstruction.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/ProcessingInstruction.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/ProcessingInstruction.java	Thu Dec  9 07:41:02 2004
@@ -1,37 +1,37 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.xml.sax.Locator;
-
-public class ProcessingInstruction extends Event {
-    public ProcessingInstruction(Locator location, String target, String data) {
-        super(location);
-        this.target = target;
-        this.data = data;
-    }
-
-    public String getData() {
-        return data;
-    }
-
-    public String getTarget() {
-        return target;
-    }
-
-    private final String target;
-    private final String data;
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.xml.sax.Locator;
+
+public class ProcessingInstruction extends Event {
+    public ProcessingInstruction(Locator location, String target, String data) {
+        super(location);
+        this.target = target;
+        this.data = data;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public String getTarget() {
+        return target;
+    }
+
+    private final String target;
+    private final String data;
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/SkippedEntity.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/SkippedEntity.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/SkippedEntity.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/SkippedEntity.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/SkippedEntity.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/SkippedEntity.java	Thu Dec  9 07:41:02 2004
@@ -1,31 +1,31 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.xml.sax.Locator;
-
-public class SkippedEntity extends Event {
-    public SkippedEntity(Locator location, String name) {
-        super(location);
-        this.name = name;
-    }
-
-    final String name;
-
-    public String getName() {
-        return name;
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.xml.sax.Locator;
+
+public class SkippedEntity extends Event {
+    public SkippedEntity(Locator location, String name) {
+        super(location);
+        this.name = name;
+    }
+
+    final String name;
+
+    public String getName() {
+        return name;
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartCDATA.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartCDATA.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartCDATA.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartCDATA.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartCDATA.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartCDATA.java	Thu Dec  9 07:41:02 2004
@@ -1,24 +1,24 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.xml.sax.Locator;
-
-public class StartCDATA extends Event {
-    public StartCDATA(Locator location) {
-        super(location);
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.xml.sax.Locator;
+
+public class StartCDATA extends Event {
+    public StartCDATA(Locator location) {
+        super(location);
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartChoose.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartChoose.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartChoose.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartChoose.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartChoose.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartChoose.java	Thu Dec  9 07:41:02 2004
@@ -1,41 +1,41 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-public class StartChoose extends StartInstruction {
-    public StartChoose(StartElement raw) {
-        super(raw);
-    }
-
-    public void setFirstChoice(StartWhen firstChoice) {
-        this.firstChoice = firstChoice;
-    }
-
-    public StartWhen getFirstChoice() {
-        return firstChoice;
-    }
-
-    public void setOtherwise(StartOtherwise otherwise) {
-        this.otherwise = otherwise;
-    }
-
-    public StartOtherwise getOtherwise() {
-        return otherwise;
-    }
-
-    private StartWhen firstChoice;
-    private StartOtherwise otherwise;
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+public class StartChoose extends StartInstruction {
+    public StartChoose(StartElement raw) {
+        super(raw);
+    }
+
+    public void setFirstChoice(StartWhen firstChoice) {
+        this.firstChoice = firstChoice;
+    }
+
+    public StartWhen getFirstChoice() {
+        return firstChoice;
+    }
+
+    public void setOtherwise(StartOtherwise otherwise) {
+        this.otherwise = otherwise;
+    }
+
+    public StartOtherwise getOtherwise() {
+        return otherwise;
+    }
+
+    private StartWhen firstChoice;
+    private StartOtherwise otherwise;
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartComment.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartComment.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartComment.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartComment.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartComment.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartComment.java	Thu Dec  9 07:41:02 2004
@@ -1,22 +1,22 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-public class StartComment extends StartInstruction {
-    public StartComment(StartElement raw) {
-        super(raw);
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+public class StartComment extends StartInstruction {
+    public StartComment(StartElement raw) {
+        super(raw);
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDTD.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDTD.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDTD.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDTD.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDTD.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDTD.java	Thu Dec  9 07:41:02 2004
@@ -1,44 +1,44 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.xml.sax.Locator;
-
-public class StartDTD extends Event {
-    public StartDTD(Locator location, String name, String publicId,
-            String systemId) {
-        super(location);
-        this.name = name;
-        this.publicId = publicId;
-        this.systemId = systemId;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public String getPublicId() {
-        return publicId;
-    }
-
-    public String getSystemId() {
-        return systemId;
-    }
-
-    private final String name;
-    private final String publicId;
-    private final String systemId;
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.xml.sax.Locator;
+
+public class StartDTD extends Event {
+    public StartDTD(Locator location, String name, String publicId,
+            String systemId) {
+        super(location);
+        this.name = name;
+        this.publicId = publicId;
+        this.systemId = systemId;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public String getPublicId() {
+        return publicId;
+    }
+
+    public String getSystemId() {
+        return systemId;
+    }
+
+    private final String name;
+    private final String publicId;
+    private final String systemId;
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDefine.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDefine.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDefine.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDefine.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDefine.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDefine.java	Thu Dec  9 07:41:02 2004
@@ -1,100 +1,100 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-public class StartDefine extends StartInstruction {
-    public StartDefine(StartElement raw, String namespace, String name) {
-        super(raw);
-        this.namespace = namespace;
-        this.name = name;
-        this.qname = "{" + namespace + "}" + name;
-        this.parameters = new HashMap();
-    }
-
-    final String name;
-    final String namespace;
-    private final String qname;
-    private final Map parameters;
-    private Event body;
-
-    public void finish() throws SAXException {
-        Event e = next;
-        boolean params = true;
-        while (e != this.endInstruction) {
-            if (e instanceof StartParameter) {
-                StartParameter startParam = (StartParameter) e;
-                if (!params) {
-                    throw new SAXParseException(
-                            "<parameter> not allowed here: \""
-                                    + startParam.name + "\"", startParam
-                                    .getLocation(), null);
-                }
-                Object prev = getParameters().put(startParam.name, startParam);
-                if (prev != null) {
-                    throw new SAXParseException("duplicate parameter: \""
-                            + startParam.name + "\"", location, null);
-                }
-                e = startParam.endInstruction;
-            } else if (e instanceof IgnorableWhitespace) {
-                // EMPTY
-            } else if (e instanceof Characters) {
-                // check for whitespace
-                char[] ch = ((TextEvent) e).getRaw();
-                int len = ch.length;
-                for (int i = 0; i < len; i++) {
-                    if (!Character.isWhitespace(ch[i])) {
-                        if (params) {
-                            params = false;
-                            setBody(e);
-                        }
-                        break;
-                    }
-                }
-            } else {
-                if (params) {
-                    params = false;
-                    setBody(e);
-                }
-            }
-            e = e.getNext();
-        }
-        if (this.getBody() == null) {
-            this.setBody(this.endInstruction);
-        }
-    }
-
-    public Map getParameters() {
-        return parameters;
-    }
-
-    void setBody(Event body) {
-        this.body = body;
-    }
-
-    public Event getBody() {
-        return body;
-    }
-
-    public String getQname() {
-        return qname;
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+public class StartDefine extends StartInstruction {
+    public StartDefine(StartElement raw, String namespace, String name) {
+        super(raw);
+        this.namespace = namespace;
+        this.name = name;
+        this.qname = "{" + namespace + "}" + name;
+        this.parameters = new HashMap();
+    }
+
+    final String name;
+    final String namespace;
+    private final String qname;
+    private final Map parameters;
+    private Event body;
+
+    public void finish() throws SAXException {
+        Event e = next;
+        boolean params = true;
+        while (e != this.endInstruction) {
+            if (e instanceof StartParameter) {
+                StartParameter startParam = (StartParameter) e;
+                if (!params) {
+                    throw new SAXParseException(
+                            "<parameter> not allowed here: \""
+                                    + startParam.name + "\"", startParam
+                                    .getLocation(), null);
+                }
+                Object prev = getParameters().put(startParam.name, startParam);
+                if (prev != null) {
+                    throw new SAXParseException("duplicate parameter: \""
+                            + startParam.name + "\"", location, null);
+                }
+                e = startParam.endInstruction;
+            } else if (e instanceof IgnorableWhitespace) {
+                // EMPTY
+            } else if (e instanceof Characters) {
+                // check for whitespace
+                char[] ch = ((TextEvent) e).getRaw();
+                int len = ch.length;
+                for (int i = 0; i < len; i++) {
+                    if (!Character.isWhitespace(ch[i])) {
+                        if (params) {
+                            params = false;
+                            setBody(e);
+                        }
+                        break;
+                    }
+                }
+            } else {
+                if (params) {
+                    params = false;
+                    setBody(e);
+                }
+            }
+            e = e.getNext();
+        }
+        if (this.getBody() == null) {
+            this.setBody(this.endInstruction);
+        }
+    }
+
+    public Map getParameters() {
+        return parameters;
+    }
+
+    void setBody(Event body) {
+        this.body = body;
+    }
+
+    public Event getBody() {
+        return body;
+    }
+
+    public String getQname() {
+        return qname;
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDocument.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDocument.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDocument.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDocument.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDocument.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDocument.java	Thu Dec  9 07:41:02 2004
@@ -1,61 +1,61 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.apache.excalibur.source.SourceValidity;
-import org.xml.sax.Locator;
-
-public class StartDocument extends Event {
-    public StartDocument(Locator location) {
-        super(location);
-        templateProperties = new HashMap();
-    }
-
-    private SourceValidity compileTime;
-    EndDocument endDocument; // null if document fragment
-    Map templateProperties;
-
-    public EndDocument getEndDocument() {
-        return endDocument;
-    }
-
-    public void setEndDocument(EndDocument endDoc) {
-        this.endDocument = endDoc;
-    }
-
-    public Map getTemplateProperties() {
-        return templateProperties;
-    }
-
-    /**
-     * @param compileTime
-     *            The compileTime to set.
-     */
-    public void setCompileTime(SourceValidity compileTime) {
-        this.compileTime = compileTime;
-    }
-
-    /**
-     * @return Returns the compileTime.
-     */
-    public SourceValidity getCompileTime() {
-        return compileTime;
-    }
-
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.excalibur.source.SourceValidity;
+import org.xml.sax.Locator;
+
+public class StartDocument extends Event {
+    public StartDocument(Locator location) {
+        super(location);
+        templateProperties = new HashMap();
+    }
+
+    private SourceValidity compileTime;
+    EndDocument endDocument; // null if document fragment
+    Map templateProperties;
+
+    public EndDocument getEndDocument() {
+        return endDocument;
+    }
+
+    public void setEndDocument(EndDocument endDoc) {
+        this.endDocument = endDoc;
+    }
+
+    public Map getTemplateProperties() {
+        return templateProperties;
+    }
+
+    /**
+     * @param compileTime
+     *            The compileTime to set.
+     */
+    public void setCompileTime(SourceValidity compileTime) {
+        this.compileTime = compileTime;
+    }
+
+    /**
+     * @return Returns the compileTime.
+     */
+    public SourceValidity getCompileTime() {
+        return compileTime;
+    }
+
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartElement.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartElement.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartElement.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartElement.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartElement.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartElement.java	Thu Dec  9 07:41:02 2004
@@ -1,174 +1,174 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.cocoon.template.jxtg.environment.ErrorHolder;
-import org.apache.cocoon.template.jxtg.expression.JXTExpression;
-import org.apache.cocoon.template.jxtg.expression.Literal;
-import org.apache.cocoon.template.jxtg.script.Parser;
-import org.xml.sax.Attributes;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-import org.xml.sax.helpers.AttributesImpl;
-
-public class StartElement extends Event {
-    public StartElement(Locator location, String namespaceURI,
-            String localName, String raw, Attributes attrs) throws SAXException {
-        super(location);
-        this.namespaceURI = namespaceURI;
-        this.localName = localName;
-        this.raw = raw;
-        this.qname = "{" + namespaceURI + "}" + localName;
-        StringBuffer buf = new StringBuffer();
-        int len = attrs.getLength();
-        for (int i = 0; i < len; i++) {
-            String uri = attrs.getURI(i);
-            String local = attrs.getLocalName(i);
-            String qname = attrs.getQName(i);
-            String type = attrs.getType(i);
-            String value = attrs.getValue(i);
-            StringReader in = new StringReader(value);
-            int ch;
-            buf.setLength(0);
-            boolean inExpr = false;
-            List substEvents = new LinkedList();
-            boolean xpath = false;
-            try {
-                top: while ((ch = in.read()) != -1) {
-                    char c = (char) ch;
-                    processChar: while (true) {
-                        if (inExpr) {
-                            if (c == '\\') {
-                                ch = in.read();
-                                buf.append(ch == -1 ? '\\' : (char) ch);
-                            } else if (c == '}') {
-                                String str = buf.toString();
-                                JXTExpression compiledExpression;
-                                try {
-                                    compiledExpression = Parser.compile(str,
-                                            xpath);
-                                } catch (Exception exc) {
-                                    throw new SAXParseException(exc
-                                            .getMessage(), location, exc);
-                                } catch (Error err) {
-                                    throw new SAXParseException(err
-                                            .getMessage(), location,
-                                            new ErrorHolder(err));
-                                }
-                                substEvents.add(compiledExpression);
-                                buf.setLength(0);
-                                inExpr = false;
-                            } else {
-                                buf.append(c);
-                            }
-                        } else if (c == '$' || c == '#') {
-                            ch = in.read();
-                            if (ch == '{') {
-                                if (buf.length() > 0) {
-                                    substEvents
-                                            .add(new Literal(buf.toString()));
-                                    buf.setLength(0);
-                                }
-                                inExpr = true;
-                                xpath = c == '#';
-                                continue top;
-                            }
-                            buf.append(c);
-                            if (ch != -1) {
-                                c = (char) ch;
-                                continue processChar;
-                            }
-                        } else {
-                            buf.append(c);
-                        }
-                        break;
-                    }
-                }
-            } catch (IOException ignored) {
-                ignored.printStackTrace();
-            }
-            if (inExpr) {
-                // unclosed #{} or ${}
-                String msg = "Unterminated " + (xpath ? "#" : "$") + "{";
-                throw new SAXParseException(msg, location, null);
-            }
-            if (buf.length() > 0) {
-                if (substEvents.size() == 0) {
-                    getAttributeEvents().add(
-                            new CopyAttribute(uri, local, qname, type, value));
-                } else {
-                    substEvents.add(new Literal(buf.toString()));
-                    getAttributeEvents().add(
-                            new SubstituteAttribute(uri, local, qname, type,
-                                    substEvents));
-                }
-            } else {
-                if (substEvents.size() > 0) {
-                    getAttributeEvents().add(
-                            new SubstituteAttribute(uri, local, qname, type,
-                                    substEvents));
-                } else {
-                    getAttributeEvents().add(
-                            new CopyAttribute(uri, local, qname, type, ""));
-                }
-            }
-        }
-        this.attributes = new AttributesImpl(attrs);
-    }
-
-    final String namespaceURI;
-    final String localName;
-    final String raw;
-    private final String qname;
-    private final List attributeEvents = new LinkedList();
-    final Attributes attributes;
-    EndElement endElement;
-
-    public EndElement getEndElement() {
-        return endElement;
-    }
-
-    public String getLocalName() {
-        return localName;
-    }
-
-    public String getNamespaceURI() {
-        return namespaceURI;
-    }
-
-    public String getRaw() {
-        return raw;
-    }
-
-    public String getQname() {
-        return qname;
-    }
-
-    public List getAttributeEvents() {
-        return attributeEvents;
-    }
-
-    public void setEndElement(EndElement endElement) {
-        this.endElement = endElement;
-
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.cocoon.template.jxtg.environment.ErrorHolder;
+import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+import org.apache.cocoon.template.jxtg.expression.Literal;
+import org.apache.cocoon.template.jxtg.script.Parser;
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+import org.xml.sax.helpers.AttributesImpl;
+
+public class StartElement extends Event {
+    public StartElement(Locator location, String namespaceURI,
+            String localName, String raw, Attributes attrs) throws SAXException {
+        super(location);
+        this.namespaceURI = namespaceURI;
+        this.localName = localName;
+        this.raw = raw;
+        this.qname = "{" + namespaceURI + "}" + localName;
+        StringBuffer buf = new StringBuffer();
+        int len = attrs.getLength();
+        for (int i = 0; i < len; i++) {
+            String uri = attrs.getURI(i);
+            String local = attrs.getLocalName(i);
+            String qname = attrs.getQName(i);
+            String type = attrs.getType(i);
+            String value = attrs.getValue(i);
+            StringReader in = new StringReader(value);
+            int ch;
+            buf.setLength(0);
+            boolean inExpr = false;
+            List substEvents = new LinkedList();
+            boolean xpath = false;
+            try {
+                top: while ((ch = in.read()) != -1) {
+                    char c = (char) ch;
+                    processChar: while (true) {
+                        if (inExpr) {
+                            if (c == '\\') {
+                                ch = in.read();
+                                buf.append(ch == -1 ? '\\' : (char) ch);
+                            } else if (c == '}') {
+                                String str = buf.toString();
+                                JXTExpression compiledExpression;
+                                try {
+                                    compiledExpression = Parser.compile(str,
+                                            xpath);
+                                } catch (Exception exc) {
+                                    throw new SAXParseException(exc
+                                            .getMessage(), location, exc);
+                                } catch (Error err) {
+                                    throw new SAXParseException(err
+                                            .getMessage(), location,
+                                            new ErrorHolder(err));
+                                }
+                                substEvents.add(compiledExpression);
+                                buf.setLength(0);
+                                inExpr = false;
+                            } else {
+                                buf.append(c);
+                            }
+                        } else if (c == '$' || c == '#') {
+                            ch = in.read();
+                            if (ch == '{') {
+                                if (buf.length() > 0) {
+                                    substEvents
+                                            .add(new Literal(buf.toString()));
+                                    buf.setLength(0);
+                                }
+                                inExpr = true;
+                                xpath = c == '#';
+                                continue top;
+                            }
+                            buf.append(c);
+                            if (ch != -1) {
+                                c = (char) ch;
+                                continue processChar;
+                            }
+                        } else {
+                            buf.append(c);
+                        }
+                        break;
+                    }
+                }
+            } catch (IOException ignored) {
+                ignored.printStackTrace();
+            }
+            if (inExpr) {
+                // unclosed #{} or ${}
+                String msg = "Unterminated " + (xpath ? "#" : "$") + "{";
+                throw new SAXParseException(msg, location, null);
+            }
+            if (buf.length() > 0) {
+                if (substEvents.size() == 0) {
+                    getAttributeEvents().add(
+                            new CopyAttribute(uri, local, qname, type, value));
+                } else {
+                    substEvents.add(new Literal(buf.toString()));
+                    getAttributeEvents().add(
+                            new SubstituteAttribute(uri, local, qname, type,
+                                    substEvents));
+                }
+            } else {
+                if (substEvents.size() > 0) {
+                    getAttributeEvents().add(
+                            new SubstituteAttribute(uri, local, qname, type,
+                                    substEvents));
+                } else {
+                    getAttributeEvents().add(
+                            new CopyAttribute(uri, local, qname, type, ""));
+                }
+            }
+        }
+        this.attributes = new AttributesImpl(attrs);
+    }
+
+    final String namespaceURI;
+    final String localName;
+    final String raw;
+    private final String qname;
+    private final List attributeEvents = new LinkedList();
+    final Attributes attributes;
+    EndElement endElement;
+
+    public EndElement getEndElement() {
+        return endElement;
+    }
+
+    public String getLocalName() {
+        return localName;
+    }
+
+    public String getNamespaceURI() {
+        return namespaceURI;
+    }
+
+    public String getRaw() {
+        return raw;
+    }
+
+    public String getQname() {
+        return qname;
+    }
+
+    public List getAttributeEvents() {
+        return attributeEvents;
+    }
+
+    public void setEndElement(EndElement endElement) {
+        this.endElement = endElement;
+
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEntity.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEntity.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEntity.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEntity.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEntity.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEntity.java	Thu Dec  9 07:41:02 2004
@@ -1,31 +1,31 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.xml.sax.Locator;
-
-public class StartEntity extends Event {
-    public StartEntity(Locator location, String name) {
-        super(location);
-        this.name = name;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    private final String name;
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.xml.sax.Locator;
+
+public class StartEntity extends Event {
+    public StartEntity(Locator location, String name) {
+        super(location);
+        this.name = name;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    private final String name;
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEval.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEval.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEval.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEval.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEval.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEval.java	Thu Dec  9 07:41:02 2004
@@ -1,31 +1,31 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.apache.cocoon.template.jxtg.expression.JXTExpression;
-
-public class StartEval extends StartInstruction {
-    public StartEval(StartElement raw, JXTExpression value) {
-        super(raw);
-        this.value = value;
-    }
-
-    public JXTExpression getValue() {
-        return value;
-    }
-
-    private final JXTExpression value;
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+
+public class StartEval extends StartInstruction {
+    public StartEval(StartElement raw, JXTExpression value) {
+        super(raw);
+        this.value = value;
+    }
+
+    public JXTExpression getValue() {
+        return value;
+    }
+
+    private final JXTExpression value;
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEvalBody.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEvalBody.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEvalBody.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEvalBody.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEvalBody.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEvalBody.java	Thu Dec  9 07:41:02 2004
@@ -1,22 +1,22 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-public class StartEvalBody extends StartInstruction {
-    public StartEvalBody(StartElement raw) {
-        super(raw);
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+public class StartEvalBody extends StartInstruction {
+    public StartEvalBody(StartElement raw) {
+        super(raw);
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartForEach.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartForEach.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartForEach.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartForEach.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartForEach.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartForEach.java	Thu Dec  9 07:41:02 2004
@@ -1,69 +1,69 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.apache.cocoon.template.jxtg.expression.JXTExpression;
-
-public class StartForEach extends StartInstruction {
-    public StartForEach(StartElement raw, JXTExpression items,
-            JXTExpression var, JXTExpression varStatus, JXTExpression begin,
-            JXTExpression end, JXTExpression step, Boolean lenient) {
-        super(raw);
-        this.items = items;
-        this.var = var;
-        this.varStatus = varStatus;
-        this.begin = begin;
-        this.end = end;
-        this.step = step;
-        this.lenient = lenient;
-    }
-
-    final JXTExpression items;
-    final JXTExpression var;
-    final JXTExpression varStatus;
-    final JXTExpression begin;
-    final JXTExpression end;
-    final JXTExpression step;
-    final Boolean lenient;
-
-    public JXTExpression getBegin() {
-        return begin;
-    }
-
-    public JXTExpression getEnd() {
-        return end;
-    }
-
-    public JXTExpression getItems() {
-        return items;
-    }
-
-    public Boolean getLenient() {
-        return lenient;
-    }
-
-    public JXTExpression getStep() {
-        return step;
-    }
-
-    public JXTExpression getVar() {
-        return var;
-    }
-
-    public JXTExpression getVarStatus() {
-        return varStatus;
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+
+public class StartForEach extends StartInstruction {
+    public StartForEach(StartElement raw, JXTExpression items,
+            JXTExpression var, JXTExpression varStatus, JXTExpression begin,
+            JXTExpression end, JXTExpression step, Boolean lenient) {
+        super(raw);
+        this.items = items;
+        this.var = var;
+        this.varStatus = varStatus;
+        this.begin = begin;
+        this.end = end;
+        this.step = step;
+        this.lenient = lenient;
+    }
+
+    final JXTExpression items;
+    final JXTExpression var;
+    final JXTExpression varStatus;
+    final JXTExpression begin;
+    final JXTExpression end;
+    final JXTExpression step;
+    final Boolean lenient;
+
+    public JXTExpression getBegin() {
+        return begin;
+    }
+
+    public JXTExpression getEnd() {
+        return end;
+    }
+
+    public JXTExpression getItems() {
+        return items;
+    }
+
+    public Boolean getLenient() {
+        return lenient;
+    }
+
+    public JXTExpression getStep() {
+        return step;
+    }
+
+    public JXTExpression getVar() {
+        return var;
+    }
+
+    public JXTExpression getVarStatus() {
+        return varStatus;
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatDate.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatDate.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatDate.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatDate.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatDate.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatDate.java	Thu Dec  9 07:41:02 2004
@@ -1,164 +1,164 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.Locale;
-import java.util.TimeZone;
-
-import org.apache.cocoon.template.jxtg.environment.ValueHelper;
-import org.apache.cocoon.template.jxtg.expression.JXTExpression;
-import org.apache.commons.jexl.JexlContext;
-import org.apache.commons.jxpath.JXPathContext;
-
-public class StartFormatDate extends StartInstruction {
-
-    private static final String DATE = "date";
-    private static final String TIME = "time";
-    private static final String DATETIME = "both";
-
-    JXTExpression var;
-    JXTExpression value;
-    JXTExpression type;
-    JXTExpression pattern;
-    JXTExpression timeZone;
-    JXTExpression dateStyle;
-    JXTExpression timeStyle;
-    JXTExpression locale;
-
-    public StartFormatDate(StartElement raw, JXTExpression var,
-            JXTExpression value, JXTExpression type, JXTExpression pattern,
-            JXTExpression timeZone, JXTExpression dateStyle,
-            JXTExpression timeStyle, JXTExpression locale) {
-        super(raw);
-        this.var = var;
-        this.value = value;
-        this.type = type;
-        this.pattern = pattern;
-        this.timeZone = timeZone;
-        this.dateStyle = dateStyle;
-        this.timeStyle = timeStyle;
-        this.locale = locale;
-    }
-
-    public String format(JexlContext jexl, JXPathContext jxp) throws Exception {
-        String var = ValueHelper.getStringValue(this.var, jexl, jxp);
-        Object value = ValueHelper.getValue(this.value, jexl, jxp);
-        Object locVal = ValueHelper.getValue(this.locale, jexl, jxp);
-        String pattern = ValueHelper.getStringValue(this.pattern, jexl,
-                jxp);
-        Object timeZone = ValueHelper
-                .getValue(this.timeZone, jexl, jxp);
-
-        String type = ValueHelper.getStringValue(this.type, jexl, jxp);
-        String timeStyle = ValueHelper.getStringValue(this.timeStyle,
-                jexl, jxp);
-        String dateStyle = ValueHelper.getStringValue(this.dateStyle,
-                jexl, jxp);
-
-        String formatted = null;
-
-        // Create formatter
-        Locale locale;
-        if (locVal != null) {
-            locale = locVal instanceof Locale ? (Locale) locVal
-                    : ValueHelper.parseLocale(locVal.toString(), null);
-        } else {
-            locale = Locale.getDefault();
-        }
-        DateFormat formatter = createFormatter(locale, type, dateStyle,
-                timeStyle);
-        // Apply pattern, if present
-        if (pattern != null) {
-            try {
-                ((SimpleDateFormat) formatter).applyPattern(pattern);
-            } catch (ClassCastException cce) {
-                formatter = new SimpleDateFormat(pattern, locale);
-            }
-        }
-        // Set time zone
-        TimeZone tz = null;
-        if ((timeZone instanceof String) && ((String) timeZone).equals("")) {
-            timeZone = null;
-        }
-        if (timeZone != null) {
-            if (timeZone instanceof String) {
-                tz = TimeZone.getTimeZone((String) timeZone);
-            } else if (timeZone instanceof TimeZone) {
-                tz = (TimeZone) timeZone;
-            } else {
-                throw new IllegalArgumentException("Illegal timeZone value: \""
-                        + timeZone + "\"");
-            }
-        }
-        if (tz != null) {
-            formatter.setTimeZone(tz);
-        }
-        formatted = formatter.format(value);
-        if (var != null) {
-            jexl.getVars().put(var, formatted);
-            jxp.getVariables().declareVariable(var, formatted);
-            return null;
-        }
-        return formatted;
-    }
-
-    private DateFormat createFormatter(Locale loc, String type,
-            String dateStyle, String timeStyle) throws Exception {
-        DateFormat formatter = null;
-        if ((type == null) || DATE.equalsIgnoreCase(type)) {
-            formatter = DateFormat.getDateInstance(getStyle(dateStyle), loc);
-        } else if (TIME.equalsIgnoreCase(type)) {
-            formatter = DateFormat.getTimeInstance(getStyle(timeStyle), loc);
-        } else if (DATETIME.equalsIgnoreCase(type)) {
-            formatter = DateFormat.getDateTimeInstance(getStyle(dateStyle),
-                    getStyle(timeStyle), loc);
-        } else {
-            throw new IllegalArgumentException("Invalid type: \"" + type + "\"");
-        }
-        return formatter;
-    }
-
-    private static final String DEFAULT = "default";
-    private static final String SHORT = "short";
-    private static final String MEDIUM = "medium";
-    private static final String LONG = "long";
-    private static final String FULL = "full";
-
-    private int getStyle(String style) {
-        int ret = DateFormat.DEFAULT;
-        if (style != null) {
-            if (DEFAULT.equalsIgnoreCase(style)) {
-                ret = DateFormat.DEFAULT;
-            } else if (SHORT.equalsIgnoreCase(style)) {
-                ret = DateFormat.SHORT;
-            } else if (MEDIUM.equalsIgnoreCase(style)) {
-                ret = DateFormat.MEDIUM;
-            } else if (LONG.equalsIgnoreCase(style)) {
-                ret = DateFormat.LONG;
-            } else if (FULL.equalsIgnoreCase(style)) {
-                ret = DateFormat.FULL;
-            } else {
-                throw new IllegalArgumentException(
-                        "Invalid style: \""
-                                + style
-                                + "\": should be \"default\" or \"short\" or \"medium\" or \"long\" or \"full\"");
-            }
-        }
-        return ret;
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
+import java.util.TimeZone;
+
+import org.apache.cocoon.template.jxtg.environment.ValueHelper;
+import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+import org.apache.commons.jexl.JexlContext;
+import org.apache.commons.jxpath.JXPathContext;
+
+public class StartFormatDate extends StartInstruction {
+
+    private static final String DATE = "date";
+    private static final String TIME = "time";
+    private static final String DATETIME = "both";
+
+    JXTExpression var;
+    JXTExpression value;
+    JXTExpression type;
+    JXTExpression pattern;
+    JXTExpression timeZone;
+    JXTExpression dateStyle;
+    JXTExpression timeStyle;
+    JXTExpression locale;
+
+    public StartFormatDate(StartElement raw, JXTExpression var,
+            JXTExpression value, JXTExpression type, JXTExpression pattern,
+            JXTExpression timeZone, JXTExpression dateStyle,
+            JXTExpression timeStyle, JXTExpression locale) {
+        super(raw);
+        this.var = var;
+        this.value = value;
+        this.type = type;
+        this.pattern = pattern;
+        this.timeZone = timeZone;
+        this.dateStyle = dateStyle;
+        this.timeStyle = timeStyle;
+        this.locale = locale;
+    }
+
+    public String format(JexlContext jexl, JXPathContext jxp) throws Exception {
+        String var = ValueHelper.getStringValue(this.var, jexl, jxp);
+        Object value = ValueHelper.getValue(this.value, jexl, jxp);
+        Object locVal = ValueHelper.getValue(this.locale, jexl, jxp);
+        String pattern = ValueHelper.getStringValue(this.pattern, jexl,
+                jxp);
+        Object timeZone = ValueHelper
+                .getValue(this.timeZone, jexl, jxp);
+
+        String type = ValueHelper.getStringValue(this.type, jexl, jxp);
+        String timeStyle = ValueHelper.getStringValue(this.timeStyle,
+                jexl, jxp);
+        String dateStyle = ValueHelper.getStringValue(this.dateStyle,
+                jexl, jxp);
+
+        String formatted = null;
+
+        // Create formatter
+        Locale locale;
+        if (locVal != null) {
+            locale = locVal instanceof Locale ? (Locale) locVal
+                    : ValueHelper.parseLocale(locVal.toString(), null);
+        } else {
+            locale = Locale.getDefault();
+        }
+        DateFormat formatter = createFormatter(locale, type, dateStyle,
+                timeStyle);
+        // Apply pattern, if present
+        if (pattern != null) {
+            try {
+                ((SimpleDateFormat) formatter).applyPattern(pattern);
+            } catch (ClassCastException cce) {
+                formatter = new SimpleDateFormat(pattern, locale);
+            }
+        }
+        // Set time zone
+        TimeZone tz = null;
+        if ((timeZone instanceof String) && ((String) timeZone).equals("")) {
+            timeZone = null;
+        }
+        if (timeZone != null) {
+            if (timeZone instanceof String) {
+                tz = TimeZone.getTimeZone((String) timeZone);
+            } else if (timeZone instanceof TimeZone) {
+                tz = (TimeZone) timeZone;
+            } else {
+                throw new IllegalArgumentException("Illegal timeZone value: \""
+                        + timeZone + "\"");
+            }
+        }
+        if (tz != null) {
+            formatter.setTimeZone(tz);
+        }
+        formatted = formatter.format(value);
+        if (var != null) {
+            jexl.getVars().put(var, formatted);
+            jxp.getVariables().declareVariable(var, formatted);
+            return null;
+        }
+        return formatted;
+    }
+
+    private DateFormat createFormatter(Locale loc, String type,
+            String dateStyle, String timeStyle) throws Exception {
+        DateFormat formatter = null;
+        if ((type == null) || DATE.equalsIgnoreCase(type)) {
+            formatter = DateFormat.getDateInstance(getStyle(dateStyle), loc);
+        } else if (TIME.equalsIgnoreCase(type)) {
+            formatter = DateFormat.getTimeInstance(getStyle(timeStyle), loc);
+        } else if (DATETIME.equalsIgnoreCase(type)) {
+            formatter = DateFormat.getDateTimeInstance(getStyle(dateStyle),
+                    getStyle(timeStyle), loc);
+        } else {
+            throw new IllegalArgumentException("Invalid type: \"" + type + "\"");
+        }
+        return formatter;
+    }
+
+    private static final String DEFAULT = "default";
+    private static final String SHORT = "short";
+    private static final String MEDIUM = "medium";
+    private static final String LONG = "long";
+    private static final String FULL = "full";
+
+    private int getStyle(String style) {
+        int ret = DateFormat.DEFAULT;
+        if (style != null) {
+            if (DEFAULT.equalsIgnoreCase(style)) {
+                ret = DateFormat.DEFAULT;
+            } else if (SHORT.equalsIgnoreCase(style)) {
+                ret = DateFormat.SHORT;
+            } else if (MEDIUM.equalsIgnoreCase(style)) {
+                ret = DateFormat.MEDIUM;
+            } else if (LONG.equalsIgnoreCase(style)) {
+                ret = DateFormat.LONG;
+            } else if (FULL.equalsIgnoreCase(style)) {
+                ret = DateFormat.FULL;
+            } else {
+                throw new IllegalArgumentException(
+                        "Invalid style: \""
+                                + style
+                                + "\": should be \"default\" or \"short\" or \"medium\" or \"long\" or \"full\"");
+            }
+        }
+        return ret;
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatNumber.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatNumber.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatNumber.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatNumber.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatNumber.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatNumber.java	Thu Dec  9 07:41:02 2004
@@ -1,253 +1,253 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import java.lang.reflect.Method;
-import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
-import java.text.NumberFormat;
-import java.util.Locale;
-
-import org.apache.cocoon.template.jxtg.environment.ValueHelper;
-import org.apache.cocoon.template.jxtg.expression.JXTExpression;
-import org.apache.commons.jexl.JexlContext;
-import org.apache.commons.jxpath.JXPathContext;
-import org.apache.commons.lang.StringUtils;
-
-public class StartFormatNumber extends StartInstruction {
-
-    JXTExpression value;
-    JXTExpression type;
-    JXTExpression pattern;
-    JXTExpression currencyCode;
-    JXTExpression currencySymbol;
-    JXTExpression isGroupingUsed;
-    JXTExpression maxIntegerDigits;
-    JXTExpression minIntegerDigits;
-    JXTExpression maxFractionDigits;
-    JXTExpression minFractionDigits;
-    JXTExpression locale;
-
-    JXTExpression var;
-
-    private static Class currencyClass;
-    private static final String NUMBER = "number";
-    private static final String CURRENCY = "currency";
-    private static final String PERCENT = "percent";
-
-    static {
-        try {
-            currencyClass = Class.forName("java.util.Currency");
-            // container's runtime is J2SE 1.4 or greater
-        } catch (Exception cnfe) {
-            // EMPTY
-        }
-    }
-
-    public StartFormatNumber(StartElement raw, JXTExpression var,
-            JXTExpression value, JXTExpression type, JXTExpression pattern,
-            JXTExpression currencyCode, JXTExpression currencySymbol,
-            JXTExpression isGroupingUsed, JXTExpression maxIntegerDigits,
-            JXTExpression minIntegerDigits, JXTExpression maxFractionDigits,
-            JXTExpression minFractionDigits, JXTExpression locale) {
-        super(raw);
-        this.var = var;
-        this.value = value;
-        this.type = type;
-        this.pattern = pattern;
-        this.currencyCode = currencyCode;
-        this.currencySymbol = currencySymbol;
-        this.isGroupingUsed = isGroupingUsed;
-        this.maxIntegerDigits = maxIntegerDigits;
-        this.minIntegerDigits = minIntegerDigits;
-        this.maxFractionDigits = maxFractionDigits;
-        this.minFractionDigits = minFractionDigits;
-        this.locale = locale;
-    }
-
-    public String format(JexlContext jexl, JXPathContext jxp) throws Exception {
-        // Determine formatting locale
-        String var = ValueHelper.getStringValue(this.var, jexl, jxp);
-        Number input = ValueHelper
-                .getNumberValue(this.value, jexl, jxp);
-        String type = ValueHelper.getStringValue(this.type, jexl, jxp);
-        String pattern = ValueHelper.getStringValue(this.pattern, jexl,
-                jxp);
-        String currencyCode = ValueHelper.getStringValue(
-                this.currencyCode, jexl, jxp);
-        String currencySymbol = ValueHelper.getStringValue(
-                this.currencySymbol, jexl, jxp);
-        Boolean isGroupingUsed = ValueHelper.getBooleanValue(
-                this.isGroupingUsed, jexl, jxp);
-        Number maxIntegerDigits = ValueHelper.getNumberValue(
-                this.maxIntegerDigits, jexl, jxp);
-        Number minIntegerDigits = ValueHelper.getNumberValue(
-                this.minIntegerDigits, jexl, jxp);
-        Number maxFractionDigits = ValueHelper.getNumberValue(
-                this.maxFractionDigits, jexl, jxp);
-        Number minFractionDigits = ValueHelper.getNumberValue(
-                this.minFractionDigits, jexl, jxp);
-        String localeStr = ValueHelper.getStringValue(this.locale,
-                jexl, jxp);
-        Locale loc = localeStr != null ? ValueHelper.parseLocale(
-                localeStr, null) : Locale.getDefault();
-        String formatted;
-        if (loc != null) {
-            // Create formatter
-            NumberFormat formatter = null;
-            if (StringUtils.isNotEmpty(pattern)) {
-                // if 'pattern' is specified, 'type' is ignored
-                DecimalFormatSymbols symbols = new DecimalFormatSymbols(loc);
-                formatter = new DecimalFormat(pattern, symbols);
-            } else {
-                formatter = createFormatter(loc, type);
-            }
-            if (StringUtils.isNotEmpty(pattern)
-                    || CURRENCY.equalsIgnoreCase(type)) {
-                setCurrency(formatter, currencyCode, currencySymbol);
-            }
-            configureFormatter(formatter, isGroupingUsed, maxIntegerDigits,
-                    minIntegerDigits, maxFractionDigits, minFractionDigits);
-            formatted = formatter.format(input);
-        } else {
-            // no formatting locale available, use toString()
-            formatted = input.toString();
-        }
-        if (var != null) {
-            jexl.getVars().put(var, formatted);
-            jxp.getVariables().declareVariable(var, formatted);
-            return null;
-        }
-        return formatted;
-    }
-
-    private NumberFormat createFormatter(Locale loc, String type)
-            throws Exception {
-        NumberFormat formatter = null;
-        if ((type == null) || NUMBER.equalsIgnoreCase(type)) {
-            formatter = NumberFormat.getNumberInstance(loc);
-        } else if (CURRENCY.equalsIgnoreCase(type)) {
-            formatter = NumberFormat.getCurrencyInstance(loc);
-        } else if (PERCENT.equalsIgnoreCase(type)) {
-            formatter = NumberFormat.getPercentInstance(loc);
-        } else {
-            throw new IllegalArgumentException("Invalid type: \"" + type
-                    + "\": should be \"number\" or \"currency\" or \"percent\"");
-        }
-        return formatter;
-    }
-
-    /*
-     * Applies the 'groupingUsed', 'maxIntegerDigits', 'minIntegerDigits',
-     * 'maxFractionDigits', and 'minFractionDigits' attributes to the given
-     * formatter.
-     */
-    private void configureFormatter(NumberFormat formatter,
-            Boolean isGroupingUsed, Number maxIntegerDigits,
-            Number minIntegerDigits, Number maxFractionDigits,
-            Number minFractionDigits) {
-        if (isGroupingUsed != null)
-            formatter.setGroupingUsed(isGroupingUsed.booleanValue());
-        if (maxIntegerDigits != null)
-            formatter.setMaximumIntegerDigits(maxIntegerDigits.intValue());
-        if (minIntegerDigits != null)
-            formatter.setMinimumIntegerDigits(minIntegerDigits.intValue());
-        if (maxFractionDigits != null)
-            formatter.setMaximumFractionDigits(maxFractionDigits.intValue());
-        if (minFractionDigits != null)
-            formatter.setMinimumFractionDigits(minFractionDigits.intValue());
-    }
-
-    /*
-     * Override the formatting locale's default currency symbol with the
-     * specified currency code (specified via the "currencyCode" attribute) or
-     * currency symbol (specified via the "currencySymbol" attribute).
-     * 
-     * If both "currencyCode" and "currencySymbol" are present, "currencyCode"
-     * takes precedence over "currencySymbol" if the java.util.Currency class is
-     * defined in the container's runtime (that is, if the container's runtime
-     * is J2SE 1.4 or greater), and "currencySymbol" takes precendence over
-     * "currencyCode" otherwise.
-     * 
-     * If only "currencyCode" is given, it is used as a currency symbol if
-     * java.util.Currency is not defined.
-     * 
-     * Example:
-     * 
-     * JDK "currencyCode" "currencySymbol" Currency symbol being displayed
-     * -----------------------------------------------------------------------
-     * all --- --- Locale's default currency symbol
-     * 
-     * <1.4 EUR --- EUR >=1.4 EUR --- Locale's currency symbol for Euro
-     * 
-     * all --- \u20AC \u20AC
-     * 
-     * <1.4 EUR \u20AC \u20AC >=1.4 EUR \u20AC Locale's currency symbol for Euro
-     */
-    private void setCurrency(NumberFormat formatter, String currencyCode,
-            String currencySymbol) throws Exception {
-        String code = null;
-        String symbol = null;
-
-        if (currencyCode == null) {
-            if (currencySymbol == null) {
-                return;
-            }
-            symbol = currencySymbol;
-        } else if (currencySymbol != null) {
-            if (currencyClass != null) {
-                code = currencyCode;
-            } else {
-                symbol = currencySymbol;
-            }
-        } else if (currencyClass != null) {
-            code = currencyCode;
-        } else {
-            symbol = currencyCode;
-        }
-        if (code != null) {
-            Object[] methodArgs = new Object[1];
-
-            /*
-             * java.util.Currency.getInstance()
-             */
-            Method m = currencyClass.getMethod("getInstance",
-                    new Class[] { String.class });
-
-            methodArgs[0] = code;
-            Object currency = m.invoke(null, methodArgs);
-
-            /*
-             * java.text.NumberFormat.setCurrency()
-             */
-            Class[] paramTypes = new Class[1];
-            paramTypes[0] = currencyClass;
-            Class numberFormatClass = Class.forName("java.text.NumberFormat");
-            m = numberFormatClass.getMethod("setCurrency", paramTypes);
-            methodArgs[0] = currency;
-            m.invoke(formatter, methodArgs);
-        } else {
-            /*
-             * Let potential ClassCastException propagate up (will almost never
-             * happen)
-             */
-            DecimalFormat df = (DecimalFormat) formatter;
-            DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
-            dfs.setCurrencySymbol(symbol);
-            df.setDecimalFormatSymbols(dfs);
-        }
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import java.lang.reflect.Method;
+import java.text.DecimalFormat;
+import java.text.DecimalFormatSymbols;
+import java.text.NumberFormat;
+import java.util.Locale;
+
+import org.apache.cocoon.template.jxtg.environment.ValueHelper;
+import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+import org.apache.commons.jexl.JexlContext;
+import org.apache.commons.jxpath.JXPathContext;
+import org.apache.commons.lang.StringUtils;
+
+public class StartFormatNumber extends StartInstruction {
+
+    JXTExpression value;
+    JXTExpression type;
+    JXTExpression pattern;
+    JXTExpression currencyCode;
+    JXTExpression currencySymbol;
+    JXTExpression isGroupingUsed;
+    JXTExpression maxIntegerDigits;
+    JXTExpression minIntegerDigits;
+    JXTExpression maxFractionDigits;
+    JXTExpression minFractionDigits;
+    JXTExpression locale;
+
+    JXTExpression var;
+
+    private static Class currencyClass;
+    private static final String NUMBER = "number";
+    private static final String CURRENCY = "currency";
+    private static final String PERCENT = "percent";
+
+    static {
+        try {
+            currencyClass = Class.forName("java.util.Currency");
+            // container's runtime is J2SE 1.4 or greater
+        } catch (Exception cnfe) {
+            // EMPTY
+        }
+    }
+
+    public StartFormatNumber(StartElement raw, JXTExpression var,
+            JXTExpression value, JXTExpression type, JXTExpression pattern,
+            JXTExpression currencyCode, JXTExpression currencySymbol,
+            JXTExpression isGroupingUsed, JXTExpression maxIntegerDigits,
+            JXTExpression minIntegerDigits, JXTExpression maxFractionDigits,
+            JXTExpression minFractionDigits, JXTExpression locale) {
+        super(raw);
+        this.var = var;
+        this.value = value;
+        this.type = type;
+        this.pattern = pattern;
+        this.currencyCode = currencyCode;
+        this.currencySymbol = currencySymbol;
+        this.isGroupingUsed = isGroupingUsed;
+        this.maxIntegerDigits = maxIntegerDigits;
+        this.minIntegerDigits = minIntegerDigits;
+        this.maxFractionDigits = maxFractionDigits;
+        this.minFractionDigits = minFractionDigits;
+        this.locale = locale;
+    }
+
+    public String format(JexlContext jexl, JXPathContext jxp) throws Exception {
+        // Determine formatting locale
+        String var = ValueHelper.getStringValue(this.var, jexl, jxp);
+        Number input = ValueHelper
+                .getNumberValue(this.value, jexl, jxp);
+        String type = ValueHelper.getStringValue(this.type, jexl, jxp);
+        String pattern = ValueHelper.getStringValue(this.pattern, jexl,
+                jxp);
+        String currencyCode = ValueHelper.getStringValue(
+                this.currencyCode, jexl, jxp);
+        String currencySymbol = ValueHelper.getStringValue(
+                this.currencySymbol, jexl, jxp);
+        Boolean isGroupingUsed = ValueHelper.getBooleanValue(
+                this.isGroupingUsed, jexl, jxp);
+        Number maxIntegerDigits = ValueHelper.getNumberValue(
+                this.maxIntegerDigits, jexl, jxp);
+        Number minIntegerDigits = ValueHelper.getNumberValue(
+                this.minIntegerDigits, jexl, jxp);
+        Number maxFractionDigits = ValueHelper.getNumberValue(
+                this.maxFractionDigits, jexl, jxp);
+        Number minFractionDigits = ValueHelper.getNumberValue(
+                this.minFractionDigits, jexl, jxp);
+        String localeStr = ValueHelper.getStringValue(this.locale,
+                jexl, jxp);
+        Locale loc = localeStr != null ? ValueHelper.parseLocale(
+                localeStr, null) : Locale.getDefault();
+        String formatted;
+        if (loc != null) {
+            // Create formatter
+            NumberFormat formatter = null;
+            if (StringUtils.isNotEmpty(pattern)) {
+                // if 'pattern' is specified, 'type' is ignored
+                DecimalFormatSymbols symbols = new DecimalFormatSymbols(loc);
+                formatter = new DecimalFormat(pattern, symbols);
+            } else {
+                formatter = createFormatter(loc, type);
+            }
+            if (StringUtils.isNotEmpty(pattern)
+                    || CURRENCY.equalsIgnoreCase(type)) {
+                setCurrency(formatter, currencyCode, currencySymbol);
+            }
+            configureFormatter(formatter, isGroupingUsed, maxIntegerDigits,
+                    minIntegerDigits, maxFractionDigits, minFractionDigits);
+            formatted = formatter.format(input);
+        } else {
+            // no formatting locale available, use toString()
+            formatted = input.toString();
+        }
+        if (var != null) {
+            jexl.getVars().put(var, formatted);
+            jxp.getVariables().declareVariable(var, formatted);
+            return null;
+        }
+        return formatted;
+    }
+
+    private NumberFormat createFormatter(Locale loc, String type)
+            throws Exception {
+        NumberFormat formatter = null;
+        if ((type == null) || NUMBER.equalsIgnoreCase(type)) {
+            formatter = NumberFormat.getNumberInstance(loc);
+        } else if (CURRENCY.equalsIgnoreCase(type)) {
+            formatter = NumberFormat.getCurrencyInstance(loc);
+        } else if (PERCENT.equalsIgnoreCase(type)) {
+            formatter = NumberFormat.getPercentInstance(loc);
+        } else {
+            throw new IllegalArgumentException("Invalid type: \"" + type
+                    + "\": should be \"number\" or \"currency\" or \"percent\"");
+        }
+        return formatter;
+    }
+
+    /*
+     * Applies the 'groupingUsed', 'maxIntegerDigits', 'minIntegerDigits',
+     * 'maxFractionDigits', and 'minFractionDigits' attributes to the given
+     * formatter.
+     */
+    private void configureFormatter(NumberFormat formatter,
+            Boolean isGroupingUsed, Number maxIntegerDigits,
+            Number minIntegerDigits, Number maxFractionDigits,
+            Number minFractionDigits) {
+        if (isGroupingUsed != null)
+            formatter.setGroupingUsed(isGroupingUsed.booleanValue());
+        if (maxIntegerDigits != null)
+            formatter.setMaximumIntegerDigits(maxIntegerDigits.intValue());
+        if (minIntegerDigits != null)
+            formatter.setMinimumIntegerDigits(minIntegerDigits.intValue());
+        if (maxFractionDigits != null)
+            formatter.setMaximumFractionDigits(maxFractionDigits.intValue());
+        if (minFractionDigits != null)
+            formatter.setMinimumFractionDigits(minFractionDigits.intValue());
+    }
+
+    /*
+     * Override the formatting locale's default currency symbol with the
+     * specified currency code (specified via the "currencyCode" attribute) or
+     * currency symbol (specified via the "currencySymbol" attribute).
+     * 
+     * If both "currencyCode" and "currencySymbol" are present, "currencyCode"
+     * takes precedence over "currencySymbol" if the java.util.Currency class is
+     * defined in the container's runtime (that is, if the container's runtime
+     * is J2SE 1.4 or greater), and "currencySymbol" takes precendence over
+     * "currencyCode" otherwise.
+     * 
+     * If only "currencyCode" is given, it is used as a currency symbol if
+     * java.util.Currency is not defined.
+     * 
+     * Example:
+     * 
+     * JDK "currencyCode" "currencySymbol" Currency symbol being displayed
+     * -----------------------------------------------------------------------
+     * all --- --- Locale's default currency symbol
+     * 
+     * <1.4 EUR --- EUR >=1.4 EUR --- Locale's currency symbol for Euro
+     * 
+     * all --- \u20AC \u20AC
+     * 
+     * <1.4 EUR \u20AC \u20AC >=1.4 EUR \u20AC Locale's currency symbol for Euro
+     */
+    private void setCurrency(NumberFormat formatter, String currencyCode,
+            String currencySymbol) throws Exception {
+        String code = null;
+        String symbol = null;
+
+        if (currencyCode == null) {
+            if (currencySymbol == null) {
+                return;
+            }
+            symbol = currencySymbol;
+        } else if (currencySymbol != null) {
+            if (currencyClass != null) {
+                code = currencyCode;
+            } else {
+                symbol = currencySymbol;
+            }
+        } else if (currencyClass != null) {
+            code = currencyCode;
+        } else {
+            symbol = currencyCode;
+        }
+        if (code != null) {
+            Object[] methodArgs = new Object[1];
+
+            /*
+             * java.util.Currency.getInstance()
+             */
+            Method m = currencyClass.getMethod("getInstance",
+                    new Class[] { String.class });
+
+            methodArgs[0] = code;
+            Object currency = m.invoke(null, methodArgs);
+
+            /*
+             * java.text.NumberFormat.setCurrency()
+             */
+            Class[] paramTypes = new Class[1];
+            paramTypes[0] = currencyClass;
+            Class numberFormatClass = Class.forName("java.text.NumberFormat");
+            m = numberFormatClass.getMethod("setCurrency", paramTypes);
+            methodArgs[0] = currency;
+            m.invoke(formatter, methodArgs);
+        } else {
+            /*
+             * Let potential ClassCastException propagate up (will almost never
+             * happen)
+             */
+            DecimalFormat df = (DecimalFormat) formatter;
+            DecimalFormatSymbols dfs = df.getDecimalFormatSymbols();
+            dfs.setCurrencySymbol(symbol);
+            df.setDecimalFormatSymbols(dfs);
+        }
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartIf.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartIf.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartIf.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartIf.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartIf.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartIf.java	Thu Dec  9 07:41:02 2004
@@ -1,31 +1,31 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.apache.cocoon.template.jxtg.expression.JXTExpression;
-
-public class StartIf extends StartInstruction {
-    public StartIf(StartElement raw, JXTExpression test) {
-        super(raw);
-        this.test = test;
-    }
-
-    final JXTExpression test;
-
-    public JXTExpression getTest() {
-        return test;
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+
+public class StartIf extends StartInstruction {
+    public StartIf(StartElement raw, JXTExpression test) {
+        super(raw);
+        this.test = test;
+    }
+
+    final JXTExpression test;
+
+    public JXTExpression getTest() {
+        return test;
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartImport.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartImport.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartImport.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartImport.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartImport.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartImport.java	Thu Dec  9 07:41:02 2004
@@ -1,38 +1,38 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.apache.cocoon.template.jxtg.expression.JXTExpression;
-
-public class StartImport extends StartInstruction {
-    public StartImport(StartElement raw, AttributeEvent uri,
-            JXTExpression select) {
-        super(raw);
-        this.uri = uri;
-        this.select = select;
-    }
-
-    public AttributeEvent getUri() {
-        return uri;
-    }
-
-    public JXTExpression getSelect() {
-        return select;
-    }
-
-    private final AttributeEvent uri;
-    private final JXTExpression select;
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+
+public class StartImport extends StartInstruction {
+    public StartImport(StartElement raw, AttributeEvent uri,
+            JXTExpression select) {
+        super(raw);
+        this.uri = uri;
+        this.select = select;
+    }
+
+    public AttributeEvent getUri() {
+        return uri;
+    }
+
+    public JXTExpression getSelect() {
+        return select;
+    }
+
+    private final AttributeEvent uri;
+    private final JXTExpression select;
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartInstruction.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartInstruction.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartInstruction.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartInstruction.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartInstruction.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartInstruction.java	Thu Dec  9 07:41:02 2004
@@ -1,35 +1,35 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-
-public class StartInstruction extends Event {
-    StartInstruction(StartElement startElement) {
-        super(startElement.getLocation());
-        this.startElement = startElement;
-    }
-
-    final StartElement startElement;
-    EndInstruction endInstruction;
-
-    public EndInstruction getEndInstruction() {
-        return endInstruction;
-    }
-
-    public void setEndInstruction(EndInstruction endInstruction) {
-        this.endInstruction = endInstruction;
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+
+public class StartInstruction extends Event {
+    StartInstruction(StartElement startElement) {
+        super(startElement.getLocation());
+        this.startElement = startElement;
+    }
+
+    final StartElement startElement;
+    EndInstruction endInstruction;
+
+    public EndInstruction getEndInstruction() {
+        return endInstruction;
+    }
+
+    public void setEndInstruction(EndInstruction endInstruction) {
+        this.endInstruction = endInstruction;
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartOtherwise.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartOtherwise.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartOtherwise.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartOtherwise.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartOtherwise.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartOtherwise.java	Thu Dec  9 07:41:02 2004
@@ -1,22 +1,22 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-public class StartOtherwise extends StartInstruction {
-    public StartOtherwise(StartElement raw) {
-        super(raw);
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+public class StartOtherwise extends StartInstruction {
+    public StartOtherwise(StartElement raw) {
+        super(raw);
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartOut.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartOut.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartOut.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartOut.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartOut.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartOut.java	Thu Dec  9 07:41:02 2004
@@ -1,37 +1,37 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.apache.cocoon.template.jxtg.expression.JXTExpression;
-
-public class StartOut extends StartInstruction {
-    public StartOut(StartElement raw, JXTExpression expr, Boolean lenient) {
-        super(raw);
-        this.compiledExpression = expr;
-        this.lenient = lenient;
-    }
-
-    public JXTExpression getCompiledExpression() {
-        return compiledExpression;
-    }
-
-    public Boolean getLenient() {
-        return lenient;
-    }
-
-    private final JXTExpression compiledExpression;
-    private final Boolean lenient;
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+
+public class StartOut extends StartInstruction {
+    public StartOut(StartElement raw, JXTExpression expr, Boolean lenient) {
+        super(raw);
+        this.compiledExpression = expr;
+        this.lenient = lenient;
+    }
+
+    public JXTExpression getCompiledExpression() {
+        return compiledExpression;
+    }
+
+    public Boolean getLenient() {
+        return lenient;
+    }
+
+    private final JXTExpression compiledExpression;
+    private final Boolean lenient;
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartParameter.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartParameter.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartParameter.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartParameter.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartParameter.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartParameter.java	Thu Dec  9 07:41:02 2004
@@ -1,34 +1,34 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-public class StartParameter extends StartInstruction {
-    public StartParameter(StartElement raw, String name, String optional,
-            String defaultValue) {
-        super(raw);
-        this.name = name;
-        this.optional = optional;
-        this.defaultValue = defaultValue;
-    }
-
-    public String getDefaultValue() {
-        return defaultValue;
-    }
-
-    final String name;
-    final String optional;
-    private final String defaultValue;
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+public class StartParameter extends StartInstruction {
+    public StartParameter(StartElement raw, String name, String optional,
+            String defaultValue) {
+        super(raw);
+        this.name = name;
+        this.optional = optional;
+        this.defaultValue = defaultValue;
+    }
+
+    public String getDefaultValue() {
+        return defaultValue;
+    }
+
+    final String name;
+    final String optional;
+    private final String defaultValue;
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartPrefixMapping.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartPrefixMapping.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartPrefixMapping.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartPrefixMapping.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartPrefixMapping.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartPrefixMapping.java	Thu Dec  9 07:41:02 2004
@@ -1,37 +1,37 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.xml.sax.Locator;
-
-public class StartPrefixMapping extends Event {
-    public StartPrefixMapping(Locator location, String prefix, String uri) {
-        super(location);
-        this.prefix = prefix;
-        this.uri = uri;
-    }
-
-    public String getPrefix() {
-        return prefix;
-    }
-
-    public String getUri() {
-        return uri;
-    }
-
-    private final String prefix;
-    private final String uri;
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.xml.sax.Locator;
+
+public class StartPrefixMapping extends Event {
+    public StartPrefixMapping(Locator location, String prefix, String uri) {
+        super(location);
+        this.prefix = prefix;
+        this.uri = uri;
+    }
+
+    public String getPrefix() {
+        return prefix;
+    }
+
+    public String getUri() {
+        return uri;
+    }
+
+    private final String prefix;
+    private final String uri;
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartSet.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartSet.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartSet.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartSet.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartSet.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartSet.java	Thu Dec  9 07:41:02 2004
@@ -1,37 +1,37 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.apache.cocoon.template.jxtg.expression.JXTExpression;
-
-public class StartSet extends StartInstruction {
-    public StartSet(StartElement raw, JXTExpression var, JXTExpression value) {
-        super(raw);
-        this.var = var;
-        this.value = value;
-    }
-
-    public JXTExpression getVar() {
-        return var;
-    }
-
-    public JXTExpression getValue() {
-        return value;
-    }
-
-    private final JXTExpression var;
-    private final JXTExpression value;
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+
+public class StartSet extends StartInstruction {
+    public StartSet(StartElement raw, JXTExpression var, JXTExpression value) {
+        super(raw);
+        this.var = var;
+        this.value = value;
+    }
+
+    public JXTExpression getVar() {
+        return var;
+    }
+
+    public JXTExpression getValue() {
+        return value;
+    }
+
+    private final JXTExpression var;
+    private final JXTExpression value;
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartTemplate.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartTemplate.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartTemplate.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartTemplate.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartTemplate.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartTemplate.java	Thu Dec  9 07:41:02 2004
@@ -1,22 +1,22 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-public class StartTemplate extends StartInstruction {
-    public StartTemplate(StartElement raw) {
-        super(raw);
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+public class StartTemplate extends StartInstruction {
+    public StartTemplate(StartElement raw) {
+        super(raw);
+    }
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartWhen.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartWhen.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartWhen.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartWhen.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartWhen.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartWhen.java	Thu Dec  9 07:41:02 2004
@@ -1,40 +1,40 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import org.apache.cocoon.template.jxtg.expression.JXTExpression;
-
-public class StartWhen extends StartInstruction {
-    public StartWhen(StartElement raw, JXTExpression test) {
-        super(raw);
-        this.test = test;
-    }
-
-    public JXTExpression getTest() {
-        return test;
-    }
-
-    public void setNextChoice(StartWhen nextChoice) {
-        this.nextChoice = nextChoice;
-    }
-
-    public StartWhen getNextChoice() {
-        return nextChoice;
-    }
-
-    private final JXTExpression test;
-    private StartWhen nextChoice;
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+
+public class StartWhen extends StartInstruction {
+    public StartWhen(StartElement raw, JXTExpression test) {
+        super(raw);
+        this.test = test;
+    }
+
+    public JXTExpression getTest() {
+        return test;
+    }
+
+    public void setNextChoice(StartWhen nextChoice) {
+        this.nextChoice = nextChoice;
+    }
+
+    public StartWhen getNextChoice() {
+        return nextChoice;
+    }
+
+    private final JXTExpression test;
+    private StartWhen nextChoice;
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/SubstituteAttribute.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/SubstituteAttribute.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/SubstituteAttribute.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/SubstituteAttribute.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/SubstituteAttribute.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/SubstituteAttribute.java	Thu Dec  9 07:41:02 2004
@@ -1,33 +1,33 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import java.util.List;
-
-
-public class SubstituteAttribute extends AttributeEvent {
-    public SubstituteAttribute(String namespaceURI, String localName,
-            String raw, String type, List substs) {
-        super(namespaceURI, localName, raw, type);
-        this.substitutions = substs;
-    }
-
-    public List getSubstitutions() {
-        return substitutions;
-    }
-
-    private final List substitutions;
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import java.util.List;
+
+
+public class SubstituteAttribute extends AttributeEvent {
+    public SubstituteAttribute(String namespaceURI, String localName,
+            String raw, String type, List substs) {
+        super(namespaceURI, localName, raw, type);
+        this.substitutions = substs;
+    }
+
+    public List getSubstitutions() {
+        return substitutions;
+    }
+
+    private final List substitutions;
 }

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/TextEvent.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/TextEvent.java?view=diff&rev=111395&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/TextEvent.java&r1=111394&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/TextEvent.java&r2=111395
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/TextEvent.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/TextEvent.java	Thu Dec  9 07:41:02 2004
@@ -1,132 +1,132 @@
-/*
- * 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.cocoon.template.jxtg.script.event;
-
-import java.io.CharArrayReader;
-import java.io.IOException;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.apache.cocoon.template.jxtg.environment.ErrorHolder;
-import org.apache.cocoon.template.jxtg.expression.JXTExpression;
-import org.apache.commons.jexl.ExpressionFactory;
-import org.apache.commons.jxpath.JXPathContext;
-import org.apache.commons.lang.ArrayUtils;
-import org.xml.sax.Locator;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXParseException;
-
-public class TextEvent extends Event {
-    public TextEvent(Locator location, char[] chars, int start, int length)
-            throws SAXException {
-        super(location);
-        StringBuffer buf = new StringBuffer();
-        this.raw = new char[length];
-        System.arraycopy(chars, start, this.raw, 0, length);
-        CharArrayReader in = new CharArrayReader(chars, start, length);
-        int ch;
-        boolean inExpr = false;
-        boolean xpath = false;
-        try {
-            top: while ((ch = in.read()) != -1) {
-                // column++;
-                char c = (char) ch;
-                processChar: while (true) {
-                    if (inExpr) {
-                        if (c == '\\') {
-                            ch = in.read();
-                            buf.append(ch == -1 ? '\\' : (char) ch);
-                        } else if (c == '}') {
-                            String str = buf.toString();
-                            Object compiledExpression;
-                            try {
-                                if (xpath) {
-                                    compiledExpression = JXPathContext
-                                            .compile(str);
-                                } else {
-                                    compiledExpression = ExpressionFactory
-                                            .createExpression(str);
-                                }
-                            } catch (Exception exc) {
-                                throw new SAXParseException(exc.getMessage(),
-                                        this.getLocation(), exc);
-                            } catch (Error err) {
-                                throw new SAXParseException(err.getMessage(),
-                                        this.getLocation(),
-                                        new ErrorHolder(err));
-
-                            }
-                            substitutions.add(new JXTExpression(str,
-                                    compiledExpression));
-                            buf.setLength(0);
-                            inExpr = false;
-                        } else {
-                            buf.append(c);
-                        }
-                    } else if (c == '$' || c == '#') {
-                        ch = in.read();
-                        if (ch == '{') {
-                            xpath = c == '#';
-                            inExpr = true;
-                            if (buf.length() > 0) {
-                                char[] charArray = new char[buf.length()];
-
-                                buf.getChars(0, buf.length(), charArray, 0);
-                                substitutions.add(charArray);
-                                buf.setLength(0);
-                            }
-                            continue top;
-                        }
-                        buf.append(c);
-                        if (ch != -1) {
-                            c = (char) ch;
-                            continue processChar;
-                        }
-                    } else {
-                        buf.append(c);
-                    }
-                    break;
-                }
-            }
-        } catch (IOException ignored) {
-            // won't happen
-            ignored.printStackTrace();
-        }
-        if (inExpr) {
-            // unclosed #{} or ${}
-            buf.insert(0, (xpath ? "#" : "$") + "{");
-        }
-        if (buf.length() > 0) {
-            char[] charArray = new char[buf.length()];
-
-            buf.getChars(0, buf.length(), charArray, 0);
-            substitutions.add(charArray);
-        } else if (substitutions.isEmpty()) {
-            substitutions.add(ArrayUtils.EMPTY_CHAR_ARRAY);
-        }
-    }
-
-    final List substitutions = new LinkedList();
-    final char[] raw;
-
-    public char[] getRaw() {
-        return raw;
-    }
-
-    public List getSubstitutions() {
-        return substitutions;
-    }
+/*
+ * 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.cocoon.template.jxtg.script.event;
+
+import java.io.CharArrayReader;
+import java.io.IOException;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.cocoon.template.jxtg.environment.ErrorHolder;
+import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+import org.apache.commons.jexl.ExpressionFactory;
+import org.apache.commons.jxpath.JXPathContext;
+import org.apache.commons.lang.ArrayUtils;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+public class TextEvent extends Event {
+    public TextEvent(Locator location, char[] chars, int start, int length)
+            throws SAXException {
+        super(location);
+        StringBuffer buf = new StringBuffer();
+        this.raw = new char[length];
+        System.arraycopy(chars, start, this.raw, 0, length);
+        CharArrayReader in = new CharArrayReader(chars, start, length);
+        int ch;
+        boolean inExpr = false;
+        boolean xpath = false;
+        try {
+            top: while ((ch = in.read()) != -1) {
+                // column++;
+                char c = (char) ch;
+                processChar: while (true) {
+                    if (inExpr) {
+                        if (c == '\\') {
+                            ch = in.read();
+                            buf.append(ch == -1 ? '\\' : (char) ch);
+                        } else if (c == '}') {
+                            String str = buf.toString();
+                            Object compiledExpression;
+                            try {
+                                if (xpath) {
+                                    compiledExpression = JXPathContext
+                                            .compile(str);
+                                } else {
+                                    compiledExpression = ExpressionFactory
+                                            .createExpression(str);
+                                }
+                            } catch (Exception exc) {
+                                throw new SAXParseException(exc.getMessage(),
+                                        this.getLocation(), exc);
+                            } catch (Error err) {
+                                throw new SAXParseException(err.getMessage(),
+                                        this.getLocation(),
+                                        new ErrorHolder(err));
+
+                            }
+                            substitutions.add(new JXTExpression(str,
+                                    compiledExpression));
+                            buf.setLength(0);
+                            inExpr = false;
+                        } else {
+                            buf.append(c);
+                        }
+                    } else if (c == '$' || c == '#') {
+                        ch = in.read();
+                        if (ch == '{') {
+                            xpath = c == '#';
+                            inExpr = true;
+                            if (buf.length() > 0) {
+                                char[] charArray = new char[buf.length()];
+
+                                buf.getChars(0, buf.length(), charArray, 0);
+                                substitutions.add(charArray);
+                                buf.setLength(0);
+                            }
+                            continue top;
+                        }
+                        buf.append(c);
+                        if (ch != -1) {
+                            c = (char) ch;
+                            continue processChar;
+                        }
+                    } else {
+                        buf.append(c);
+                    }
+                    break;
+                }
+            }
+        } catch (IOException ignored) {
+            // won't happen
+            ignored.printStackTrace();
+        }
+        if (inExpr) {
+            // unclosed #{} or ${}
+            buf.insert(0, (xpath ? "#" : "$") + "{");
+        }
+        if (buf.length() > 0) {
+            char[] charArray = new char[buf.length()];
+
+            buf.getChars(0, buf.length(), charArray, 0);
+            substitutions.add(charArray);
+        } else if (substitutions.isEmpty()) {
+            substitutions.add(ArrayUtils.EMPTY_CHAR_ARRAY);
+        }
+    }
+
+    final List substitutions = new LinkedList();
+    final char[] raw;
+
+    public char[] getRaw() {
+        return raw;
+    }
+
+    public List getSubstitutions() {
+        return substitutions;
+    }
 }

Mime
View raw message