You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@cocoon.apache.org by da...@apache.org on 2005/01/19 23:59:38 UTC

svn commit: r125680 - in cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script: . event

Author: danielf
Date: Wed Jan 19 14:59:37 2005
New Revision: 125680

URL: http://svn.apache.org/viewcvs?view=rev&rev=125680
Log:
Moved instruction execution code from the invoker to execute methods in the instruction classes.
Modified:
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Invoker.java
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartChoose.java
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartComment.java
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDefine.java
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEval.java
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEvalBody.java
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartForEach.java
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatDate.java
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatNumber.java
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartIf.java
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartImport.java
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartInstruction.java
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartOut.java
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartSet.java
   cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartTemplate.java

Modified: cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Invoker.java
Url: http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Invoker.java?view=diff&rev=125680&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Invoker.java&r1=125679&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Invoker.java&r2=125680
==============================================================================
--- cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Invoker.java	(original)
+++ cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/Invoker.java	Wed Jan 19 14:59:37 2005
@@ -18,11 +18,8 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
-import java.util.Properties;
 
-import org.apache.cocoon.ProcessingException;
 import org.apache.cocoon.components.expression.ExpressionContext;
-import org.apache.cocoon.environment.FlowObjectModelHelper;
 import org.apache.cocoon.template.jxtg.JXTemplateGenerator;
 import org.apache.cocoon.template.jxtg.environment.ErrorHolder;
 import org.apache.cocoon.template.jxtg.environment.ExecutionContext;
@@ -33,11 +30,9 @@
 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.lang.ArrayUtils;
-import org.apache.commons.lang.StringUtils;
 import org.apache.excalibur.xml.sax.XMLizable;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
@@ -62,6 +57,8 @@
         consumer.setDocumentLocator(loc);
         while (ev != endEvent) {
             loc.setDocumentLocator(ev.getLocation());
+
+            // ContentHandler methods
             if (ev instanceof Characters) {
                 TextEvent text = (TextEvent) ev;
                 Iterator iter = text.getSubstitutions().iterator();
@@ -111,6 +108,8 @@
                     }
                     consumer.characters(chars, 0, chars.length);
                 }
+            } else if (ev instanceof EndDocument) {
+                consumer.endDocument();
             } else if (ev instanceof EndElement) {
                 EndElement endElement = (EndElement) ev;
                 StartElement startElement = endElement.getStartElement();
@@ -128,165 +127,17 @@
                                        consumer.ignorableWhitespace(ch, offset, len);
                                    }
                                });
+            } else if (ev instanceof ProcessingInstruction) {
+                ProcessingInstruction pi = (ProcessingInstruction) ev;
+                consumer.processingInstruction(pi.getTarget(), pi.getData());
             } 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 = startIf.getTest().getValue(expressionContext);
-                } 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 JXTExpression items = startForEach.getItems();
-                Iterator iter = null;
-                int begin, end, step;
-                String var, varStatus;
-                try {
-                    iter = items.getIterator(expressionContext);
-                    begin = startForEach.getBegin() == null
-                        ? 0
-                        : startForEach.getBegin().getIntValue(expressionContext);
-                    end = startForEach.getEnd() == null
-                        ? Integer.MAX_VALUE
-                        : startForEach.getEnd().getIntValue(expressionContext);
-                    step = startForEach.getStep() == null
-                        ? 1
-                        : startForEach.getStep().getIntValue(expressionContext);
-                    var = startForEach.getVar().getStringValue(expressionContext);
-                    varStatus =
-                        startForEach.getVarStatus().getStringValue(expressionContext);
-                } catch (Exception exc) {
-                    throw new SAXParseException(exc.getMessage(),
-                                                ev.getLocation(), exc);
-                } catch (Error err) {
-                    throw new SAXParseException(err.getMessage(),
-                                                ev.getLocation(), new ErrorHolder(err));
-                }
-                ExpressionContext localExpressionContext =
-                    new ExpressionContext(expressionContext);
-                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);
-                    localExpressionContext.put(varStatus, status);
-                }
-                int skipCounter, count = 1;
-                while (i <= end && iter.hasNext()) {
-                    Object value = iter.next();
-                    localExpressionContext.setContextBean(value);
-                    if (var != null) {
-                        localExpressionContext.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, localExpressionContext, executionContext,
-                            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 = startWhen.getTest().getValue(expressionContext);
-                    } 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, expressionContext, executionContext,
-                                macroCall, startWhen.getNext(),
-                                startWhen.getEndInstruction());
-                        break;
-                    }
-                    startWhen = startWhen.getNextChoice();
-                }
-                if (startWhen == null && startChoose.getOtherwise() != null) {
-                    execute(consumer, expressionContext, executionContext,
-                            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 = startSet.getVar().getStringValue(expressionContext);
-                    }
-                    if (startSet.getValue() != null) {
-                        value = startSet.getValue().getNode(expressionContext);
-                    }
-                } catch (Exception exc) {
-                    throw new SAXParseException(exc.getMessage(), ev.getLocation(), exc);
-                }
-                if (value == null) {
-                    NodeList nodeList =
-                        toDOMNodeList("set", startSet,
-                                      expressionContext, executionContext,
-                                      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) {
-                    expressionContext.put(var, value);
+            } else if (ev instanceof StartDocument) {
+                if (((StartDocument) ev).getEndDocument() != null) {
+                    // if this isn't a document fragment
+                    consumer.startDocument();
                 }
-                ev = startSet.getEndInstruction().getNext();
-                continue;
             } else if (ev instanceof StartElement) {
                 StartElement startElement = (StartElement) ev;
                 StartDefine def = (StartDefine) executionContext
@@ -419,68 +270,12 @@
                 consumer.startElement(startElement.getNamespaceURI(),
                                       startElement.getLocalName(), startElement.getRaw(),
                                       attrs);
-            } else if (ev instanceof StartFormatNumber) {
-                StartFormatNumber startFormatNumber = (StartFormatNumber) ev;
-                try {
-                    String result = startFormatNumber.format(expressionContext);
-                    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(expressionContext);
-                    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,
-                                  expressionContext, executionContext,
-                                  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;
+                                            startPrefixMapping.getUri());
+
+                // LexicalHandler methods
             } else if (ev instanceof EndCDATA) {
                 consumer.endCDATA();
             } else if (ev instanceof EndDTD) {
@@ -492,165 +287,16 @@
             } else if (ev instanceof StartDTD) {
                 StartDTD startDTD = (StartDTD) ev;
                 consumer.startDTD(startDTD.getName(), startDTD.getPublicId(),
-                        startDTD.getSystemId());
+                                  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 = startOut.getCompiledExpression().getNode(expressionContext);
-                    if (val instanceof Node) {
-                        executeDOM(consumer, (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, 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, 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 = expr.getNode(expressionContext);
-                    if (!(val instanceof StartElement)) {
-                        throw new Exception(
-                                "macro invocation required instead of: " + val);
-                    }
-                    StartElement call = (StartElement) val;
-                    execute(consumer, expressionContext, executionContext,
-                            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, expressionContext, executionContext,
-                            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;
-                executionContext.getDefinitions().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 = expr.getValue(expressionContext);
-                            } 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();
-                }
-                StartDocument doc;
-                try {
-                    doc = executionContext.getScriptManager().resolveTemplate(uri);
-                } catch (ProcessingException exc) {
-                    throw new SAXParseException(exc.getMessage(), ev
-                            .getLocation(), exc);
-                }
-                ExpressionContext selectExpressionContext = expressionContext;
-                if (startImport.getSelect() != null) {
-                    try {
-                        Object obj =
-                            startImport.getSelect().getValue(expressionContext);
-                        selectExpressionContext =
-                            new ExpressionContext(expressionContext);
-                        selectExpressionContext.setContextBean(obj);
-                        FlowObjectModelHelper.fillContext(obj, selectExpressionContext);
-                    } 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, expressionContext, executionContext,
-                            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();
+
+                // Instructions
+            } else if (ev instanceof StartInstruction) {
+                ev = ((StartInstruction)ev).execute(consumer,
+                                                    expressionContext, executionContext,
+                                                    macroCall, startEvent, endEvent);
                 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();
         }
@@ -693,7 +339,7 @@
      * dump a DOM document, using an IncludeXMLConsumer to filter out start/end
      * document events
      */
-    private static void executeDOM(final XMLConsumer consumer, Node node)
+    public static void executeDOM(final XMLConsumer consumer, Node node)
             throws SAXException {
         IncludeXMLConsumer includer = new IncludeXMLConsumer(consumer);
         DOMStreamer streamer = new DOMStreamer(includer);
@@ -715,11 +361,11 @@
         }
     }
 
-    private static NodeList toDOMNodeList(String elementName,
-                                          StartInstruction si,
-                                          ExpressionContext expressionContext,
-                                          ExecutionContext executionContext,
-                                          StartElement macroCall)
+    public static NodeList toDOMNodeList(String elementName,
+                                         StartInstruction si,
+                                         ExpressionContext expressionContext,
+                                         ExecutionContext executionContext,
+                                         StartElement macroCall)
             throws SAXException {
         DOMBuilder builder = new DOMBuilder();
         builder.startDocument();

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=125680&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartChoose.java&r1=125679&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartChoose.java&r2=125680
==============================================================================
--- 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	Wed Jan 19 14:59:37 2005
@@ -17,7 +17,13 @@
 
 import java.util.Stack;
 
+import org.apache.cocoon.components.expression.ExpressionContext;
+import org.apache.cocoon.template.jxtg.environment.ExecutionContext;
+import org.apache.cocoon.template.jxtg.script.Invoker;
+import org.apache.cocoon.xml.XMLConsumer;
 import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
 
 public class StartChoose extends StartInstruction {
 
@@ -26,6 +32,40 @@
 
     public StartChoose(StartElement raw, Attributes attrs, Stack stack) {
         super(raw);
+    }
+
+    public Event execute(final XMLConsumer consumer,
+                         ExpressionContext expressionContext, ExecutionContext executionContext,
+                         StartElement macroCall, Event startEvent, Event endEvent) 
+        throws SAXException {
+        StartWhen startWhen = this.firstChoice;
+        while (startWhen != null) {
+            Object val;
+            try {
+                val = startWhen.getTest().getValue(expressionContext);
+            } catch (Exception e) {
+                throw new SAXParseException(e.getMessage(), getLocation(), e);
+            }
+            boolean result;
+            if (val instanceof Boolean) {
+                result = ((Boolean) val).booleanValue();
+            } else {
+                result = (val != null);
+            }
+            if (result) {
+                Invoker.execute(consumer, expressionContext, executionContext,
+                                macroCall, startWhen.getNext(),
+                                startWhen.getEndInstruction());
+                break;
+            }
+            startWhen = startWhen.getNextChoice();
+        }
+        if (startWhen == null && this.otherwise != null) {
+            Invoker.execute(consumer, expressionContext, executionContext,
+                            macroCall, this.otherwise.getNext(),
+                            this.otherwise.getEndInstruction());
+        }
+        return getEndInstruction().getNext();
     }
 
     public void setFirstChoice(StartWhen firstChoice) {

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=125680&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartComment.java&r1=125679&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartComment.java&r2=125680
==============================================================================
--- 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	Wed Jan 19 14:59:37 2005
@@ -15,13 +15,52 @@
  */
 package org.apache.cocoon.template.jxtg.script.event;
 
+import java.util.Properties;
 import java.util.Stack;
 
+import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.components.expression.ExpressionContext;
+import org.apache.cocoon.template.jxtg.environment.ExecutionContext;
+import org.apache.cocoon.template.jxtg.script.Invoker;
+import org.apache.cocoon.xml.XMLConsumer;
+import org.apache.cocoon.xml.XMLUtils;
+import org.apache.commons.lang.StringUtils;
+import org.w3c.dom.NodeList;
 import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
 
 public class StartComment extends StartInstruction {
     public StartComment(StartElement raw, Attributes attrs, Stack stack) {
         // <jx:comment>This will be parsed</jx:comment>
         super(raw);
+    }
+
+    public Event execute(final XMLConsumer consumer,
+                         ExpressionContext expressionContext, ExecutionContext executionContext,
+                         StartElement macroCall, Event startEvent, Event endEvent) 
+        throws SAXException {
+        // Parse the body of the comment
+        NodeList nodeList =
+            Invoker.toDOMNodeList("comment", this,
+                                  expressionContext, executionContext,
+                                  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(), getLocation(), e);
+            }
+        }
+        char[] chars = new char[buf.length()];
+        buf.getChars(0, chars.length, chars, 0);
+        consumer.comment(chars, 0, chars.length);
+        return getEndInstruction().getNext();
     }
 }

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=125680&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDefine.java&r1=125679&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartDefine.java&r2=125680
==============================================================================
--- 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	Wed Jan 19 14:59:37 2005
@@ -19,6 +19,9 @@
 import java.util.Map;
 import java.util.Stack;
 
+import org.apache.cocoon.components.expression.ExpressionContext;
+import org.apache.cocoon.template.jxtg.environment.ExecutionContext;
+import org.apache.cocoon.xml.XMLConsumer;
 import org.apache.commons.lang.StringUtils;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
@@ -26,8 +29,8 @@
 
 public class StartDefine extends StartInstruction {
 
-    final String name;
-    final String namespace;
+    private final String name;
+    private final String namespace;
     private final String qname;
     private final Map parameters;
     private Event body;
@@ -52,6 +55,14 @@
         this.parameters = new HashMap();
     }
 
+    public Event execute(final XMLConsumer consumer,
+                         ExpressionContext expressionContext, ExecutionContext executionContext,
+                         StartElement macroCall, Event startEvent, Event endEvent) 
+        throws SAXException {
+        executionContext.getDefinitions().put(this.qname, this);
+        return getEndInstruction().getNext();
+    }
+
     public void finish() throws SAXException {
         Event e = next;
         boolean params = true;
@@ -64,7 +75,7 @@
                                     + startParam.name + "\"", startParam
                                     .getLocation(), null);
                 }
-                Object prev = getParameters().put(startParam.name, startParam);
+                Object prev = this.parameters.put(startParam.name, startParam);
                 if (prev != null) {
                     throw new SAXParseException("duplicate parameter: \""
                             + startParam.name + "\"", location, null);
@@ -80,7 +91,7 @@
                     if (!Character.isWhitespace(ch[i])) {
                         if (params) {
                             params = false;
-                            setBody(e);
+                            this.body = e;
                         }
                         break;
                     }
@@ -88,13 +99,13 @@
             } else {
                 if (params) {
                     params = false;
-                    setBody(e);
+                    this.body = e;
                 }
             }
             e = e.getNext();
         }
-        if (this.getBody() == null) {
-            this.setBody(this.getEndInstruction());
+        if (this.body == null) {
+            this.body = this.getEndInstruction();
         }
     }
 
@@ -102,7 +113,7 @@
         return parameters;
     }
 
-    void setBody(Event body) {
+    private void setBody(Event body) {
         this.body = body;
     }
 
@@ -110,7 +121,7 @@
         return body;
     }
 
-    public String getQname() {
+    private String getQname() {
         return qname;
     }
 }

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=125680&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEval.java&r1=125679&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEval.java&r2=125680
==============================================================================
--- 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	Wed Jan 19 14:59:37 2005
@@ -17,9 +17,15 @@
 
 import java.util.Stack;
 
+import org.apache.cocoon.components.expression.ExpressionContext;
+import org.apache.cocoon.template.jxtg.environment.ErrorHolder;
+import org.apache.cocoon.template.jxtg.environment.ExecutionContext;
 import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+import org.apache.cocoon.template.jxtg.script.Invoker;
+import org.apache.cocoon.xml.XMLConsumer;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
 
 public class StartEval extends StartInstruction {
     private final JXTExpression value;
@@ -33,7 +39,23 @@
         this.value = JXTExpression.compileExpr(select, "eval: \"select\":", getLocation());
     }
 
-    public JXTExpression getValue() {
-        return value;
+    public Event execute(final XMLConsumer consumer,
+                         ExpressionContext expressionContext, ExecutionContext executionContext,
+                         StartElement macroCall, Event startEvent, Event endEvent) 
+        throws SAXException {
+        try {
+            Object val = this.value.getNode(expressionContext);
+            if (!(val instanceof StartElement)) {
+                throw new Exception("macro invocation required instead of: " + val);
+            }
+            StartElement call = (StartElement) val;
+            Invoker.execute(consumer, expressionContext, executionContext,
+                            call, call.getNext(), call.getEndElement());
+        } catch (Exception exc) {
+            throw new SAXParseException(exc.getMessage(), getLocation(), exc);
+        } catch (Error err) {
+            throw new SAXParseException(err.getMessage(), getLocation(), new ErrorHolder(err));
+        }
+        return getEndInstruction().getNext();
     }
 }

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=125680&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEvalBody.java&r1=125679&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartEvalBody.java&r2=125680
==============================================================================
--- 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	Wed Jan 19 14:59:37 2005
@@ -17,10 +17,33 @@
 
 import java.util.Stack;
 
+import org.apache.cocoon.components.expression.ExpressionContext;
+import org.apache.cocoon.template.jxtg.environment.ErrorHolder;
+import org.apache.cocoon.template.jxtg.environment.ExecutionContext;
+import org.apache.cocoon.template.jxtg.script.Invoker;
+import org.apache.cocoon.xml.XMLConsumer;
 import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
 
 public class StartEvalBody extends StartInstruction {
     public StartEvalBody(StartElement raw, Attributes attrs, Stack stack) {
         super(raw);
+    }
+
+    public Event execute(final XMLConsumer consumer,
+                         ExpressionContext expressionContext, ExecutionContext executionContext,
+                         StartElement macroCall, Event startEvent, Event endEvent) 
+        throws SAXException {
+        try {
+            Invoker.execute(consumer, expressionContext, executionContext,
+                            null, macroCall.getNext(), macroCall.getEndElement());
+        } catch (Exception exc) {
+            throw new SAXParseException(exc.getMessage(), getLocation(), exc);
+        } catch (Error err) {
+            throw new SAXParseException(err.getMessage(), getLocation(),
+                                        new ErrorHolder(err));
+        }
+        return getEndInstruction().getNext();
     }
 }

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=125680&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartForEach.java&r1=125679&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartForEach.java&r2=125680
==============================================================================
--- 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	Wed Jan 19 14:59:37 2005
@@ -15,9 +15,15 @@
  */
 package org.apache.cocoon.template.jxtg.script.event;
 
+import java.util.Iterator;
 import java.util.Stack;
 
+import org.apache.cocoon.components.expression.ExpressionContext;
+import org.apache.cocoon.template.jxtg.environment.ErrorHolder;
+import org.apache.cocoon.template.jxtg.environment.ExecutionContext;
 import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+import org.apache.cocoon.template.jxtg.script.Invoker;
+import org.apache.cocoon.xml.XMLConsumer;
 import org.xml.sax.Attributes;
 import org.xml.sax.Locator;
 import org.xml.sax.SAXException;
@@ -25,13 +31,13 @@
 
 public class StartForEach extends StartInstruction {
 
-    final JXTExpression items;
-    final JXTExpression var;
-    final JXTExpression varStatus;
-    final JXTExpression begin;
-    final JXTExpression end;
-    final JXTExpression step;
-    final Boolean lenient;
+    private final JXTExpression items;
+    private final JXTExpression var;
+    private final JXTExpression varStatus;
+    private final JXTExpression begin;
+    private final JXTExpression end;
+    private final JXTExpression step;
+    private final Boolean lenient;
 
     public StartForEach(StartElement raw, Attributes attrs, Stack stack)
         throws SAXException {
@@ -63,31 +69,75 @@
         this.items = JXTExpression.compileExpr(items == null ? select : items, null, locator);
     }
 
-    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;
+    public Event execute(final XMLConsumer consumer,
+                         ExpressionContext expressionContext, ExecutionContext executionContext,
+                         StartElement macroCall, Event startEvent, Event endEvent) 
+        throws SAXException {
+        Iterator iter = null;
+        int begin, end, step;
+        String var, varStatus;
+        try {
+            iter = this.items.getIterator(expressionContext);
+            begin = this.begin == null
+                ? 0
+                : this.begin.getIntValue(expressionContext);
+            end = this.end == null
+                ? Integer.MAX_VALUE
+                : this.end.getIntValue(expressionContext);
+            step = this.step == null
+                ? 1
+                : this.step.getIntValue(expressionContext);
+            var = this.var.getStringValue(expressionContext);
+            varStatus = this.varStatus.getStringValue(expressionContext);
+        } catch (Exception exc) {
+            throw new SAXParseException(exc.getMessage(),
+                                        getLocation(), exc);
+        } catch (Error err) {
+            throw new SAXParseException(err.getMessage(),
+                                        getLocation(), new ErrorHolder(err));
+        }
+        ExpressionContext localExpressionContext =
+            new ExpressionContext(expressionContext);
+        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);
+            localExpressionContext.put(varStatus, status);
+        }
+        int skipCounter, count = 1;
+        while (i <= end && iter.hasNext()) {
+            Object value = iter.next();
+            localExpressionContext.setContextBean(value);
+            if (var != null) {
+                localExpressionContext.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()));
+            }
+            Invoker.execute(consumer, localExpressionContext, executionContext,
+                            macroCall, getNext(), getEndInstruction());
+            // Skip rows
+            skipCounter = step;
+            while (--skipCounter > 0 && iter.hasNext()) {
+                iter.next();
+            }
+            // Increase index
+            i += step;
+            count++;
+        }
+        return getEndInstruction().getNext();
     }
 }

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=125680&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatDate.java&r1=125679&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatDate.java&r2=125680
==============================================================================
--- 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	Wed Jan 19 14:59:37 2005
@@ -22,11 +22,15 @@
 import java.util.TimeZone;
 
 import org.apache.cocoon.components.expression.ExpressionContext;
+import org.apache.cocoon.template.jxtg.environment.ErrorHolder;
+import org.apache.cocoon.template.jxtg.environment.ExecutionContext;
 import org.apache.cocoon.template.jxtg.environment.ValueHelper;
 import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+import org.apache.cocoon.xml.XMLConsumer;
 import org.xml.sax.Attributes;
 import org.xml.sax.Locator;
 import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
 
 public class StartFormatDate extends StartInstruction {
 
@@ -34,14 +38,14 @@
     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;
+    private JXTExpression var;
+    private JXTExpression value;
+    private JXTExpression type;
+    private JXTExpression pattern;
+    private JXTExpression timeZone;
+    private JXTExpression dateStyle;
+    private JXTExpression timeStyle;
+    private JXTExpression locale;
 
     public StartFormatDate(StartElement raw, Attributes attrs, Stack stack) 
         throws SAXException{
@@ -60,7 +64,25 @@
         this.locale = JXTExpression.compileExpr(attrs.getValue("locale"), null, locator);
     }
 
-    public String format(ExpressionContext expressionContext) throws Exception {
+    public Event execute(final XMLConsumer consumer,
+                         ExpressionContext expressionContext, ExecutionContext executionContext,
+                         StartElement macroCall, Event startEvent, Event endEvent) 
+        throws SAXException {
+        try {
+            String result = format(expressionContext);
+            if (result != null) {
+                char[] chars = result.toCharArray();
+                consumer.characters(chars, 0, chars.length);
+            }
+        } catch (Exception e) {
+            throw new SAXParseException(e.getMessage(), getLocation(), e);
+        } catch (Error err) {
+            throw new SAXParseException(err.getMessage(), getLocation(), new ErrorHolder(err));
+        }
+        return getNext();
+    }
+
+    private String format(ExpressionContext expressionContext) throws Exception {
         String var = this.var.getStringValue(expressionContext);
         Object value = this.value.getValue(expressionContext);
         Object locVal = this.locale.getValue(expressionContext);
@@ -77,7 +99,7 @@
         Locale locale;
         if (locVal != null) {
             locale = locVal instanceof Locale ? (Locale) locVal
-                    : ValueHelper.parseLocale(locVal.toString(), null);
+                : ValueHelper.parseLocale(locVal.toString(), null);
         } else {
             locale = Locale.getDefault();
         }

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=125680&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatNumber.java&r1=125679&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartFormatNumber.java&r2=125680
==============================================================================
--- 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	Wed Jan 19 14:59:37 2005
@@ -23,28 +23,32 @@
 import java.util.Stack;
 
 import org.apache.cocoon.components.expression.ExpressionContext;
+import org.apache.cocoon.template.jxtg.environment.ErrorHolder;
 import org.apache.cocoon.template.jxtg.environment.ValueHelper;
+import org.apache.cocoon.template.jxtg.environment.ExecutionContext;
 import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+import org.apache.cocoon.xml.XMLConsumer;
 import org.apache.commons.lang.StringUtils;
 import org.xml.sax.Attributes;
 import org.xml.sax.Locator;
 import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
 
 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;
+    private JXTExpression value;
+    private JXTExpression type;
+    private JXTExpression pattern;
+    private JXTExpression currencyCode;
+    private JXTExpression currencySymbol;
+    private JXTExpression isGroupingUsed;
+    private JXTExpression maxIntegerDigits;
+    private JXTExpression minIntegerDigits;
+    private JXTExpression maxFractionDigits;
+    private JXTExpression minFractionDigits;
+    private JXTExpression locale;
 
-    JXTExpression var;
+    private JXTExpression var;
 
     private static Class currencyClass;
     private static final String NUMBER = "number";
@@ -88,7 +92,26 @@
         this.var = JXTExpression.compileExpr(attrs.getValue("var"), null, locator);
     }
 
-    public String format(ExpressionContext expressionContext) throws Exception {
+    public Event execute(final XMLConsumer consumer,
+                         ExpressionContext expressionContext, ExecutionContext executionContext,
+                         StartElement macroCall, Event startEvent, Event endEvent) 
+        throws SAXException {
+        try {
+            String result = format(expressionContext);
+            if (result != null) {
+                char[] chars = result.toCharArray();
+                consumer.characters(chars, 0, chars.length);
+            }
+        } catch (Exception e) {
+            throw new SAXParseException(e.getMessage(), getLocation(), e);
+        } catch (Error err) {
+            throw new SAXParseException(err.getMessage(), getLocation(),
+                                        new ErrorHolder(err));
+        }
+        return getNext();
+    }
+
+    private String format(ExpressionContext expressionContext) throws Exception {
         // Determine formatting locale
         String var = this.var.getStringValue(expressionContext);
         Number input = this.value.getNumberValue(expressionContext);

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=125680&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartIf.java&r1=125679&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartIf.java&r2=125680
==============================================================================
--- 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	Wed Jan 19 14:59:37 2005
@@ -17,14 +17,18 @@
 
 import java.util.Stack;
 
+import org.apache.cocoon.components.expression.ExpressionContext;
+import org.apache.cocoon.template.jxtg.environment.ErrorHolder;
+import org.apache.cocoon.template.jxtg.environment.ExecutionContext;
 import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+import org.apache.cocoon.xml.XMLConsumer;
 import org.xml.sax.Attributes;
 import org.xml.sax.Locator;
 import org.xml.sax.SAXException;
 import org.xml.sax.SAXParseException;
 
 public class StartIf extends StartInstruction {
-    final JXTExpression test;
+    private final JXTExpression test;
 
     public StartIf(StartElement raw, Attributes attrs, Stack stack) 
         throws SAXException {
@@ -42,7 +46,29 @@
         }
     }
 
-    public JXTExpression getTest() {
-        return test;
+    public Event execute(final XMLConsumer consumer,
+                         ExpressionContext expressionContext, ExecutionContext executionContext,
+                         StartElement macroCall, Event startEvent, Event endEvent) 
+        throws SAXException {
+
+        Object val;
+        try {
+            val = this.test.getValue(expressionContext);
+        } catch (Exception e) {
+            throw new SAXParseException(e.getMessage(), getLocation(), e);
+        } catch (Error err) {
+            throw new SAXParseException(err.getMessage(), getLocation(),
+                                        new ErrorHolder(err));
+        }
+        boolean result = false;
+        if (val instanceof Boolean) {
+            result = ((Boolean) val).booleanValue();
+        } else {
+            result = (val != null);
+        }
+        if (!result) {
+            return getEndInstruction().getNext();
+        }
+        return getNext();
     }
 }

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=125680&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartImport.java&r1=125679&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartImport.java&r2=125680
==============================================================================
--- 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	Wed Jan 19 14:59:37 2005
@@ -18,7 +18,16 @@
 import java.util.Iterator;
 import java.util.Stack;
 
+import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.components.expression.ExpressionContext;
+import org.apache.cocoon.environment.FlowObjectModelHelper;
+import org.apache.cocoon.template.jxtg.environment.ErrorHolder;
+import org.apache.cocoon.template.jxtg.environment.ExecutionContext;
 import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+import org.apache.cocoon.template.jxtg.expression.Literal;
+import org.apache.cocoon.template.jxtg.expression.Subst;
+import org.apache.cocoon.template.jxtg.script.Invoker;
+import org.apache.cocoon.xml.XMLConsumer;
 import org.xml.sax.Attributes;
 import org.xml.sax.Locator;
 import org.xml.sax.SAXException;
@@ -60,11 +69,68 @@
         this.select = select;
     }
 
-    public AttributeEvent getUri() {
-        return uri;
-    }
-
-    public JXTExpression getSelect() {
-        return select;
+    public Event execute(final XMLConsumer consumer,
+                         ExpressionContext expressionContext, ExecutionContext executionContext,
+                         StartElement macroCall, Event startEvent, Event endEvent) 
+        throws SAXException {
+        String uri;
+        AttributeEvent e = this.uri;
+        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 = expr.getValue(expressionContext);
+                    } catch (Exception exc) {
+                        throw new SAXParseException(exc.getMessage(), getLocation(), exc);
+                    } catch (Error err) {
+                        throw new SAXParseException(err.getMessage(),
+                                                    getLocation(), new ErrorHolder(err));
+                    }
+                    buf.append(val != null ? val.toString() : "");
+                }
+            }
+            uri = buf.toString();
+        }
+        StartDocument doc;
+        try {
+            doc = executionContext.getScriptManager().resolveTemplate(uri);
+        } catch (ProcessingException exc) {
+            throw new SAXParseException(exc.getMessage(), getLocation(), exc);
+        }
+        ExpressionContext selectExpressionContext = expressionContext;
+        if (this.select != null) {
+            try {
+                Object obj = this.select.getValue(expressionContext);
+                selectExpressionContext = new ExpressionContext(expressionContext);
+                selectExpressionContext.setContextBean(obj);
+                FlowObjectModelHelper.fillContext(obj, selectExpressionContext);
+            } catch (Exception exc) {
+                throw new SAXParseException(exc.getMessage(), getLocation(), exc);
+            } catch (Error err) {
+                throw new SAXParseException(err.getMessage(), getLocation(),
+                                            new ErrorHolder(err));
+            }
+        }
+        try {
+            Invoker.execute(consumer, expressionContext, executionContext,
+                            macroCall, doc.getNext(), doc.getEndDocument());
+        } catch (Exception exc) {
+            throw new SAXParseException(
+                                        "Exception occurred in imported template " + uri
+                                        + ": " + exc.getMessage(), getLocation(), exc);
+        }
+        return getEndInstruction().getNext();
     }
 }

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=125680&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartInstruction.java&r1=125679&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartInstruction.java&r2=125680
==============================================================================
--- 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	Wed Jan 19 14:59:37 2005
@@ -15,9 +15,14 @@
  */
 package org.apache.cocoon.template.jxtg.script.event;
 
+import org.apache.cocoon.components.expression.ExpressionContext;
+import org.apache.cocoon.template.jxtg.environment.ExecutionContext;
+import org.apache.cocoon.xml.XMLConsumer;
+import org.xml.sax.SAXException;
 
-public class StartInstruction extends Event {
-    StartInstruction(StartElement startElement) {
+public abstract class StartInstruction extends Event {
+
+    public StartInstruction(StartElement startElement) {
         super(startElement.getLocation());
         this.startElement = startElement;
     }
@@ -32,4 +37,12 @@
     public void setEndInstruction(EndInstruction endInstruction) {
         this.endInstruction = endInstruction;
     }
-}
\ No newline at end of file
+
+    public Event execute(final XMLConsumer consumer,
+                         ExpressionContext expressionContext,
+                         ExecutionContext executionContext,
+                         StartElement macroCall, Event startEvent, Event endEvent) 
+        throws SAXException {
+        return getNext();
+    }
+}

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=125680&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartOut.java&r1=125679&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartOut.java&r2=125680
==============================================================================
--- 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	Wed Jan 19 14:59:37 2005
@@ -17,7 +17,16 @@
 
 import java.util.Stack;
 
+import org.apache.cocoon.components.expression.ExpressionContext;
+import org.apache.cocoon.template.jxtg.environment.ExecutionContext;
 import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+import org.apache.cocoon.template.jxtg.script.Invoker;
+import org.apache.cocoon.xml.IncludeXMLConsumer;
+import org.apache.cocoon.xml.XMLConsumer;
+import org.apache.commons.lang.ArrayUtils;
+import org.apache.excalibur.xml.sax.XMLizable;
+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;
@@ -44,7 +53,40 @@
         }
     }
 
-    public JXTExpression getCompiledExpression() {
-        return compiledExpression;
+    public Event execute(final XMLConsumer consumer,
+                         ExpressionContext expressionContext, ExecutionContext executionContext,
+                         StartElement macroCall, Event startEvent, Event endEvent) 
+        throws SAXException {
+        Object val;
+        try {
+            val = this.compiledExpression.getNode(expressionContext);
+            if (val instanceof Node) {
+                Invoker.executeDOM(consumer, (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);
+                    Invoker.executeDOM(consumer, 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];
+                    Invoker.executeDOM(consumer, 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(), getLocation(), e);
+        }
+        return getNext();
     }
 }

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=125680&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartSet.java&r1=125679&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartSet.java&r2=125680
==============================================================================
--- 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	Wed Jan 19 14:59:37 2005
@@ -17,10 +17,17 @@
 
 import java.util.Stack;
 
+import org.apache.cocoon.components.expression.ExpressionContext;
+import org.apache.cocoon.template.jxtg.environment.ExecutionContext;
 import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+import org.apache.cocoon.template.jxtg.script.Invoker;
+import org.apache.cocoon.xml.XMLConsumer;
+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;
 
 public class StartSet extends StartInstruction {
 
@@ -47,11 +54,39 @@
         this.value = valueExpr;
     }
 
-    public JXTExpression getVar() {
-        return var;
-    }
+    public Event execute(final XMLConsumer consumer,
+                         ExpressionContext expressionContext, ExecutionContext executionContext,
+                         StartElement macroCall, Event startEvent, Event endEvent) 
+        throws SAXException {
 
-    public JXTExpression getValue() {
-        return value;
+        Object value = null;
+        String var = null;
+        try {
+            if (this.var != null) {
+                var = this.var.getStringValue(expressionContext);
+            }
+            if (this.value != null) {
+                value = this.value.getNode(expressionContext);
+            }
+        } catch (Exception exc) {
+            throw new SAXParseException(exc.getMessage(), getLocation(), exc);
+        }
+        if (value == null) {
+            NodeList nodeList =
+                Invoker.toDOMNodeList("set", this,
+                                      expressionContext, executionContext,
+                                      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) {
+            expressionContext.put(var, value);
+        }
+        return getEndInstruction().getNext();
     }
 }

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=125680&p1=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartTemplate.java&r1=125679&p2=cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/script/event/StartTemplate.java&r2=125680
==============================================================================
--- 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	Wed Jan 19 14:59:37 2005
@@ -17,10 +17,22 @@
 
 import java.util.Stack;
 
+import org.apache.cocoon.components.expression.ExpressionContext;
+import org.apache.cocoon.template.jxtg.environment.ExecutionContext;
+import org.apache.cocoon.xml.XMLConsumer;
 import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
 
 public class StartTemplate extends StartInstruction {
     public StartTemplate(StartElement raw, Attributes attrs, Stack stack) {
         super(raw);
+    }
+
+    public Event execute(final XMLConsumer consumer,
+                         ExpressionContext expressionContext, ExecutionContext executionContext,
+                         StartElement macroCall, Event startEvent, Event endEvent) 
+        throws SAXException {
+        // EMPTY
+        return getNext();
     }
 }