executeDOM(consumer, jexlContext,
jxpathContext, n);
}
continue;
} else if (val instanceof XMLizable) {
((XMLizable)val).toSAX(new IncludeXMLConsumer(consumer));
continue;
}
if (val != null) {
chars = val.toString().toCharArray();
} else {
chars = EMPTY_CHARS;
}
} catch (Exception e) {
throw new SAXParseException(e.getMessage(),
ev.location, e);
} catch (Error err) {
throw new SAXParseException(err.getMessage(),
ev.location,
new ErrorHolder(err));
}
}
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.startElement;
consumer.endElement(startElement.namespaceURI,
startElement.localName, startElement.raw);
} else if (ev instanceof EndPrefixMapping) {
EndPrefixMapping endPrefixMapping = (EndPrefixMapping)ev;
consumer.endPrefixMapping(endPrefixMapping.prefix);
} 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 ProcessingInstruction) {
ProcessingInstruction pi = (ProcessingInstruction)ev;
consumer.processingInstruction(pi.target, pi.data);
} else if (ev instanceof SkippedEntity) {
SkippedEntity skippedEntity = (SkippedEntity)ev;
consumer.skippedEntity(skippedEntity.name);
} else if (ev instanceof StartDocument) {
StartDocument startDoc = (StartDocument)ev;
if (startDoc.endDocument != null) {
// if this isn't a document fragment
consumer.startDocument();
}
} else if (ev instanceof StartIf) {
StartIf startIf = (StartIf)ev;
Object val;
try {
val = getValue(startIf.test, jexlContext,
jxpathContext, Boolean.TRUE);
} catch (Exception e) {
throw new SAXParseException(e.getMessage(),
ev.location, e);
} catch (Error err) {
throw new SAXParseException(err.getMessage(),
ev.location,
new ErrorHolder(err));
}
boolean result = false;
if (val instanceof Boolean) {
result = ((Boolean)val).booleanValue();
} else {
result = (val != null);
}
if (!result) {
ev = startIf.endInstruction.next;
continue;
}
} else if (ev instanceof StartForEach) {
StartForEach startForEach = (StartForEach)ev;
final Object items = startForEach.items;
Iterator iter = null;
int begin, end, step;
String var, varStatus;
try {
if (items != null) {
Expression expr = (Expression)items;
if (expr.compiledExpression instanceof CompiledExpression) {
CompiledExpression compiledExpression =
(CompiledExpression)expr.compiledExpression;
Object val =
compiledExpression.getPointer(jxpathContext,
expr.raw).getNode();
// FIXME: workaround for JXPath bug
if (val instanceof NativeArray) {
iter = new JSIntrospector.NativeArrayIterator((NativeArray)val);
} else {
iter = compiledExpression.iteratePointers(jxpathContext);
}
} else if (expr.compiledExpression instanceof org.apache.commons.jexl.Expression) {
org.apache.commons.jexl.Expression e =
(org.apache.commons.jexl.Expression)expr.compiledExpression;
Object result = e.evaluate(jexlContext);
if (result != null) {
iter = Introspector.getUberspect().getIterator(
result,
new Info(ev.location.getSystemId(),
ev.location.getLineNumber(),
ev.location.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() {
}
};
}
} else {
iter = NULL_ITER;
}
begin = startForEach.begin == null ? 0 :
getIntValue(startForEach.begin, jexlContext, jxpathContext);
end = startForEach.end == null ? Integer.MAX_VALUE :
getIntValue(startForEach.end, jexlContext,
jxpathContext);
step = startForEach.step == null ? 1 :
getIntValue(startForEach.step, jexlContext,
jxpathContext);
var = getStringValue(startForEach.var, jexlContext,
jxpathContext);
varStatus = getStringValue(startForEach.varStatus,
jexlContext, jxpathContext);
} catch (Exception exc) {
throw new SAXParseException(exc.getMessage(),
ev.location, exc);
} catch (Error err) {
throw new SAXParseException(err.getMessage(),
ev.location,
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.begin = begin;
status.end = end;
status.step = step;
status.first = 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.location, null);
}
} else {
localJXPathContext =
jxpathContextFactory.newContext(jxpathContext,
value);
}
localJXPathContext.setVariables(localJXPathVariables);
if (var != null) {
localJexlContext.put(var, value);
}
if (status != null) {
status.index = i;
status.count = count;
status.first = i == begin;
status.current = value;
status.last = (i == end || !iter.hasNext());
}
execute(consumer, localJexlContext, localJXPathContext,
macroCall, startForEach.next,
startForEach.endInstruction);
/* Skip rows */
skipCounter = step;
while (--skipCounter > 0 && iter.hasNext()) {
iter.next();
}
/* Increase index */
i += step;
count++;
}
ev = startForEach.endInstruction.next;
continue;
} else if (ev instanceof StartChoose) {
StartChoose startChoose = (StartChoose)ev;
StartWhen startWhen = startChoose.firstChoice;
while (startWhen != null) {
Object val;
try {
val = getValue(startWhen.test, jexlContext,
jxpathContext, Boolean.TRUE);
} catch (Exception e) {
throw new SAXParseException(e.getMessage(),
ev.location, e);
}
boolean result;
if (val instanceof Boolean) {
result = ((Boolean)val).booleanValue();
} else {
result = (val != null);
}
if (result) {
execute(consumer, jexlContext, jxpathContext,
macroCall, startWhen.next,
startWhen.endInstruction);
break;
}
startWhen = startWhen.nextChoice;
}
if (startWhen == null) {
if (startChoose.otherwise != null) {
execute(consumer,
jexlContext, jxpathContext, macroCall,
startChoose.otherwise.next,
startChoose.otherwise.endInstruction);
}
}
ev = startChoose.endInstruction.next;
continue;
} else if (ev instanceof StartSet) {
StartSet startSet = (StartSet)ev;
Object value = null;
String var = null;
try {
if (startSet.var != null) {
var = getStringValue(startSet.var, jexlContext,
jxpathContext);
}
if (startSet.value != null) {
value = getNode(startSet.value, jexlContext,
jxpathContext);
}
} catch (Exception exc) {
throw new SAXParseException(exc.getMessage(),
ev.location, exc);
}
if (value == null) {
DOMBuilder builder = new DOMBuilder();
builder.startDocument();
builder.startElement(NS, "set", "set", EMPTY_ATTRS);
execute(builder, jexlContext, jxpathContext, macroCall,
startSet.next, startSet.endInstruction);
builder.endElement(NS, "set", "set");
builder.endDocument();
Node node = builder.getDocument().getDocumentElement();
NodeList nodeList = node.getChildNodes();
int len = nodeList.getLength();
// JXPath doesn't handle NodeList, so convert
// it to an array
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.endInstruction.next;
continue;
} else if (ev instanceof StartElement) {
StartElement startElement = (StartElement)ev;
StartDefine def =
(StartDefine)definitions.get(startElement.qname);
if (def != null) {
Map attributeMap = new HashMap();
Iterator i = startElement.attributeEvents.iterator();
while (i.hasNext()) {
String attributeName;
Object attributeValue;
AttributeEvent attrEvent = (AttributeEvent) i.next();
attributeName = attrEvent.localName;
if (attrEvent instanceof CopyAttribute) {
CopyAttribute copy = (CopyAttribute)attrEvent;
attributeValue = copy.value;
} else if (attrEvent instanceof
SubstituteAttribute) {
SubstituteAttribute substEvent =
(SubstituteAttribute)attrEvent;
if (substEvent.substitutions.size() == 1 &&
substEvent.substitutions.get(0) instanceof
Expression) {
Expression expr = (Expression)
substEvent.substitutions.get(0);
Object val;
try {
val = getNode(expr, jexlContext,
jxpathContext);
} catch (Exception e) {
throw new SAXParseException(e.getMessage(),
ev.location, e);
} catch (Error err) {
throw new SAXParseException(err.getMessage(),
ev.location,
new ErrorHolder(err));
}
if (val == null) {
val = "";
}
attributeValue = val;
} else {
StringBuffer buf = new StringBuffer();
Iterator iterSubst =
substEvent.substitutions.iterator();
while (iterSubst.hasNext()) {
Subst subst = (Subst)iterSubst.next();
if (subst instanceof Literal) {
Literal lit = (Literal)subst;
buf.append(lit.value);
} else if (subst instanceof Expression) {
Expression expr = (Expression)subst;
Object val;
try {
val = getValue(expr, jexlContext,
jxpathContext);
} catch (Exception e) {
throw new SAXParseException(
e.getMessage(),
ev.location, e);
} catch (Error err) {
throw new SAXParseException(
err.getMessage(),
ev.location,
new ErrorHolder(err));
}
if (val == null) {
val = "";
}
buf.append(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.parameters.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.default_;
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.location, startElement, consumer, localJexlContext,
localJXPathContext, def.body, def.endInstruction);
ev = startElement.endElement.next;
continue;
}
Iterator i = startElement.attributeEvents.iterator();
AttributesImpl attrs = new AttributesImpl();
while (i.hasNext()) {
AttributeEvent attrEvent = (AttributeEvent)
i.next();
if (attrEvent instanceof CopyAttribute) {
CopyAttribute copy = (CopyAttribute)attrEvent;
attrs.addAttribute(copy.namespaceURI, copy.localName,
copy.raw, copy.type, copy.value);
} else if (attrEvent instanceof SubstituteAttribute) {
StringBuffer buf = new StringBuffer();
SubstituteAttribute substEvent =
(SubstituteAttribute)attrEvent;
Iterator iterSubst =
substEvent.substitutions.iterator();
while (iterSubst.hasNext()) {
Subst subst = (Subst)iterSubst.next();
if (subst instanceof Literal) {
Literal lit = (Literal)subst;
buf.append(lit.value);
} else if (subst instanceof Expression) {
Expression expr = (Expression)subst;
Object val;
try {
val = getValue(expr, jexlContext,
jxpathContext);
} catch (Exception e) {
throw new SAXParseException(e.getMessage(),
ev.location, e);
} catch (Error err) {
throw new SAXParseException(err.getMessage(),
ev.location,
new ErrorHolder(err));
}
if (val == null) {
val = "";
}
buf.append(val.toString());
}
}
attrs.addAttribute(attrEvent.namespaceURI,
attrEvent.localName, attrEvent.raw,
attrEvent.type, buf.toString());
}
}
consumer.startElement(startElement.namespaceURI,
startElement.localName, startElement.raw, 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.location, e);
} catch (Error err) {
throw new SAXParseException(err.getMessage(),
ev.location,
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.location, e);
} catch (Error err) {
throw new SAXParseException(err.getMessage(),
ev.location,
new ErrorHolder(err));
}
} else if (ev instanceof StartPrefixMapping) {
StartPrefixMapping startPrefixMapping = (StartPrefixMapping)ev;
consumer.startPrefixMapping(startPrefixMapping.prefix,
startPrefixMapping.uri);
} else if (ev instanceof Comment) {
TextEvent text = (TextEvent)ev;
final StringBuffer buf = new StringBuffer();
characters(jexlContext, jxpathContext, text,
new CharHandler() {
public void characters(char[] ch, int offset,
int len) throws SAXException {
buf.append(ch, offset, len);
}
});
char[] chars = new char[buf.length()];
buf.getChars(0, chars.length, chars, 0);
consumer.comment(chars, 0, chars.length);
} else if (ev instanceof EndCDATA) {
consumer.endCDATA();
} else if (ev instanceof EndDTD) {
consumer.endDTD();
} else if (ev instanceof EndEntity) {
consumer.endEntity(((EndEntity)ev).name);
} else if (ev instanceof StartCDATA) {
consumer.startCDATA();
} else if (ev instanceof StartDTD) {
StartDTD startDTD = (StartDTD)ev;
consumer.startDTD(startDTD.name, startDTD.publicId,
startDTD.systemId);
} else if (ev instanceof StartEntity) {
consumer.startEntity(((StartEntity)ev).name);
} else if (ev instanceof StartOut) {
StartOut startOut = (StartOut)ev;
Object val;
try {
val = getNode(startOut.compiledExpression, jexlContext,
jxpathContext, startOut.lenient);
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;
if (val == null) {
ch = EMPTY_CHARS;
} else {