Author: lgawron
Date: Thu Feb 24 06:11:29 2005
New Revision: 155186
URL: http://svn.apache.org/viewcvs?view=rev&rev=155186
Log:
Factor out macro calling to StartCall class. It is a little bit messy not but
will clear out as soon as it will also start to support jx:call macro="name"
statement.
Added:
cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/instruction/StartCall.java
(with props)
cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/instruction/StartParameterInstance.java
(with props)
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/StartInstruction.java
Added:
cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/instruction/StartCall.java
URL:
http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/instruction/StartCall.java?view=auto&rev=155186
==============================================================================
---
cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/instruction/StartCall.java
(added)
+++
cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/instruction/StartCall.java
Thu Feb 24 06:11:29 2005
@@ -0,0 +1,126 @@
+/*
+ * 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.instruction;
+
+import java.util.HashMap;
+import java.util.Iterator;
+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.template.jxtg.script.Invoker;
+import org.apache.cocoon.template.jxtg.script.event.AttributeEvent;
+import org.apache.cocoon.template.jxtg.script.event.Event;
+import org.apache.cocoon.template.jxtg.script.event.StartElement;
+import org.apache.cocoon.template.jxtg.script.event.StartInstruction;
+import org.apache.cocoon.xml.XMLConsumer;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+
+public class StartCall extends StartInstruction {
+// private JXTExpression macroName;
+ private Map parameters;
+ private StartElement body;
+ private StartDefine definition;
+
+ public StartCall(StartDefine definition, StartElement body)
+ throws SAXException {
+ super(body.getLocation());
+ this.parameters = new HashMap();
+ setBody(body);
+ setDefinition(definition);
+
+ Iterator i = this.body.getAttributeEvents().iterator();
+ while (i.hasNext()) {
+ AttributeEvent attrEvent = (AttributeEvent) i.next();
+ addParameterInstance(attrEvent);
+ }
+ }
+
+ public StartCall(StartElement raw, Attributes attrs, Stack stack)
+ throws SAXException {
+ super(raw);
+// Locator locator = getLocation();
+// String name = attrs.getValue("macro");
+// if (name == null) {
+// throw new SAXParseException("if: \"test\" is required", locator,
+// null);
+// }
+// this.macroName = JXTExpression.compileExpr(name, "call: \"macro\": ",
+// locator);
+ this.parameters = new HashMap();
+ }
+
+ public void setDefinition(StartDefine definition) {
+ this.definition = definition;
+ setEndInstruction(definition.getEndInstruction());
+ }
+
+ public void addParameterInstance(AttributeEvent attributeEvent)
+ throws SAXException {
+ StartParameterInstance parameter = new StartParameterInstance(
+ attributeEvent);
+ this.parameters.put(parameter.getName(), parameter);
+ }
+
+ public Event execute(XMLConsumer consumer,
+ ExpressionContext expressionContext,
+ ExecutionContext executionContext, StartElement macroCall,
+ Event startEvent, Event endEvent) throws SAXException {
+ Map attributeMap = new HashMap();
+ Iterator i = parameters.keySet().iterator();
+ while (i.hasNext()) {
+ String parameterName = (String) i.next();
+ StartParameterInstance parameter = (StartParameterInstance)
parameters
+ .get(parameterName);
+ Object parameterValue = parameter.getValue(expressionContext);
+ attributeMap.put(parameterName, parameterValue);
+ }
+ ExpressionContext localExpressionContext = new ExpressionContext(
+ expressionContext);
+ HashMap macro = new HashMap();
+ macro.put("body", this.body);
+ macro.put("arguments", attributeMap);
+ localExpressionContext.put("macro", macro);
+
+ Iterator iter = this.definition.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_;
+ }
+ localExpressionContext.put(key, val);
+ }
+ Invoker.call(getLocation(), this.body, consumer,
+ localExpressionContext, executionContext, definition.getBody(),
+ definition.getEndInstruction());
+ // ev = startElement.getEndElement().getNext();
+ return getNext();
+ }
+
+ /**
+ * @param startElement
+ */
+ public void setBody(StartElement startElement) {
+ this.body = startElement;
+ setNext(startElement.getEndElement().getNext());
+ }
+}
Propchange:
cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/instruction/StartCall.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/instruction/StartCall.java
------------------------------------------------------------------------------
svn:keywords = Id
Added:
cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/instruction/StartParameterInstance.java
URL:
http://svn.apache.org/viewcvs/cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/instruction/StartParameterInstance.java?view=auto&rev=155186
==============================================================================
---
cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/instruction/StartParameterInstance.java
(added)
+++
cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/instruction/StartParameterInstance.java
Thu Feb 24 06:11:29 2005
@@ -0,0 +1,102 @@
+/*
+ * 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.instruction;
+
+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.expression.JXTExpression;
+import org.apache.cocoon.template.jxtg.script.event.AttributeEvent;
+import org.apache.cocoon.template.jxtg.script.event.CopyAttribute;
+import org.apache.cocoon.template.jxtg.script.event.StartElement;
+import org.apache.cocoon.template.jxtg.script.event.StartInstruction;
+import org.apache.cocoon.template.jxtg.script.event.SubstituteAttribute;
+import org.xml.sax.Attributes;
+import org.xml.sax.Locator;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXParseException;
+
+public class StartParameterInstance extends StartInstruction {
+ final String name;
+ private final Object value;
+
+ public StartParameterInstance(StartElement raw, Attributes attrs,
+ Stack stack) throws SAXException {
+ super(raw);
+ Locator locator = getLocation();
+ if (stack.size() == 0 || !(stack.peek() instanceof StartCall)) {
+ throw new SAXParseException("<parameter> not allowed here",
+ locator, null);
+ } else {
+ this.name = attrs.getValue("name");
+ if (this.name == null) {
+ throw new SAXParseException("parameter: \"name\" is required",
+ locator, null);
+ }
+
+ String val = attrs.getValue("value");
+ if (val == null)
+ throw new SAXParseException("parameter: \"value\" is required",
+ locator, null);
+
+ this.value = JXTExpression.compileExpr(val,
+ "parameter: \"value\": ", locator);
+ }
+ }
+
+ public StartParameterInstance(AttributeEvent event) {
+ super( (Locator) null );
+ this.name = event.getLocalName();
+ this.value = event;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public Object getValue(ExpressionContext expressionContext)
+ throws SAXException {
+ if (this.value instanceof CopyAttribute) {
+ CopyAttribute copy = (CopyAttribute) this.value;
+ return copy.getValue();
+ } else if (this.value instanceof SubstituteAttribute) {
+ SubstituteAttribute substEvent = (SubstituteAttribute) this.value;
+ if (substEvent.getSubstitutions().size() == 1
+ && substEvent.getSubstitutions().get(0) instanceof
JXTExpression) {
+ JXTExpression expr = (JXTExpression) substEvent
+ .getSubstitutions().get(0);
+ Object val;
+ try {
+ val = expr.getNode(expressionContext);
+ } catch (Exception e) {
+ throw new SAXParseException(e.getMessage(), getLocation(),
+ e);
+ } catch (Error err) {
+ throw new SAXParseException(err.getMessage(),
+ getLocation(), new ErrorHolder(err));
+ }
+ return val != null ? val : "";
+ } else {
+ return substEvent.getSubstitutions().toString(getLocation(),
+ expressionContext);
+ }
+ } else {
+ throw new Error("this shouldn't have happened");
+ }
+
+ }
+}
Propchange:
cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/instruction/StartParameterInstance.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
cocoon/trunk/src/blocks/template/java/org/apache/cocoon/template/jxtg/instruction/StartParameterInstance.java
------------------------------------------------------------------------------
svn:keywords = Id
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&r1=155185&r2=155186
==============================================================================
---
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
Thu Feb 24 06:11:29 2005
@@ -15,24 +15,15 @@
*/
package org.apache.cocoon.template.jxtg.script;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-
import org.apache.cocoon.components.expression.ExpressionContext;
import org.apache.cocoon.template.jxtg.JXTemplateGenerator;
-import org.apache.cocoon.template.jxtg.environment.ErrorHolder;
import org.apache.cocoon.template.jxtg.environment.ExecutionContext;
import org.apache.cocoon.template.jxtg.environment.LocatorFacade;
-import org.apache.cocoon.template.jxtg.expression.JXTExpression;
+import org.apache.cocoon.template.jxtg.instruction.StartCall;
import org.apache.cocoon.template.jxtg.instruction.StartDefine;
-import org.apache.cocoon.template.jxtg.instruction.StartParameter;
-import org.apache.cocoon.template.jxtg.script.event.AttributeEvent;
-import org.apache.cocoon.template.jxtg.script.event.CopyAttribute;
import org.apache.cocoon.template.jxtg.script.event.Event;
import org.apache.cocoon.template.jxtg.script.event.StartElement;
import org.apache.cocoon.template.jxtg.script.event.StartInstruction;
-import org.apache.cocoon.template.jxtg.script.event.SubstituteAttribute;
import org.apache.cocoon.xml.IncludeXMLConsumer;
import org.apache.cocoon.xml.XMLConsumer;
import org.apache.cocoon.xml.dom.DOMBuilder;
@@ -72,67 +63,10 @@
continue;
}
- // this is a macro call
- 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 = expr.getNode(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));
- }
- attributeValue = val != null ? val : "";
- } else {
- attributeValue = substEvent.getSubstitutions()
- .toString(ev.getLocation(),
- expressionContext);
- }
- } else {
- throw new Error("this shouldn't have happened");
- }
- attributeMap.put(attributeName, attributeValue);
- }
- ExpressionContext localExpressionContext = new
ExpressionContext(
- expressionContext);
- HashMap macro = new HashMap();
- macro.put("body", startElement);
- macro.put("arguments", attributeMap);
- localExpressionContext.put("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_;
- }
- localExpressionContext.put(key, val);
- }
- call(ev.getLocation(), startElement, consumer,
- localExpressionContext, executionContext,
- def.getBody(), def.getEndInstruction());
- ev = startElement.getEndElement().getNext();
- } else
+ StartCall call = new StartCall( def, startElement );
+ ev = call.execute(consumer, expressionContext,
+ executionContext, macroCall, startEvent, endEvent);
+ } else
ev = ev.execute(consumer, expressionContext, executionContext,
macroCall, startEvent, endEvent);
}
@@ -176,7 +110,7 @@
streamer.stream(node);
}
- private static void call(Locator location, StartElement macroCall,
+ public static void call(Locator location, StartElement macroCall,
final XMLConsumer consumer, ExpressionContext expressionContext,
ExecutionContext executionContext, Event startEvent, Event
endEvent)
throws SAXException {
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&r1=155185&r2=155186
==============================================================================
---
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 Feb 24 06:11:29 2005
@@ -15,8 +15,13 @@
*/
package org.apache.cocoon.template.jxtg.script.event;
+import org.xml.sax.Locator;
public abstract class StartInstruction extends Event {
+ public StartInstruction(Locator locator) {
+ super(locator);
+ startElement = null;
+ }
public StartInstruction(StartElement startElement) {
super(startElement.getLocation());