blob: 2501531b696df3c98b3a93cad070f1dab4a97ca8 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.instruction;
import java.io.StringWriter;
import java.util.Stack;
import org.apache.cocoon.components.expression.ExpressionContext;
import org.apache.cocoon.template.JXTemplateGenerator;
import org.apache.cocoon.template.environment.ExecutionContext;
import org.apache.cocoon.template.environment.ParsingContext;
import org.apache.cocoon.template.expression.JXTExpression;
import org.apache.cocoon.template.script.Invoker;
import org.apache.cocoon.template.script.event.Event;
import org.apache.cocoon.template.script.event.StartElement;
import org.apache.cocoon.template.xml.AttributeAwareXMLConsumer;
import org.apache.cocoon.xml.ContentHandlerWrapper;
import org.apache.cocoon.xml.XMLConsumer;
import org.apache.xml.serialize.TextSerializer;
import org.xml.sax.Attributes;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.helpers.AttributesImpl;
/**
* @version $Id$
*/
public class Attribute extends Instruction {
private JXTExpression name;
private JXTExpression value;
public Attribute(ParsingContext parsingContext, StartElement raw, Attributes attrs, Stack stack)
throws SAXException {
super(raw);
Locator locator = getLocation();
String name = attrs.getValue("name");
if (name == null) {
throw new SAXParseException("parameter: \"name\" is required", locator, null);
}
this.name = parsingContext.getStringTemplateParser().compileExpr(name, "parameter: \"name\": ", locator);
String value = attrs.getValue("value");
this.value = parsingContext.getStringTemplateParser().compileExpr(value, "parameter: \"value\": ", locator);
}
public Event execute(final XMLConsumer consumer, ExpressionContext expressionContext,
ExecutionContext executionContext, MacroContext macroContext, Event startEvent, Event endEvent)
throws SAXException {
String nameStr = null;
String valueStr = "";
try {
nameStr = this.name.getStringValue(expressionContext);
if (this.value != null)
valueStr = this.value.getStringValue(expressionContext);
else {
final Attributes EMPTY_ATTRS = new AttributesImpl();
String elementName = "attribute";
TextSerializer serializer = new TextSerializer();
StringWriter writer = new StringWriter();
serializer.setOutputCharStream(writer);
ContentHandlerWrapper contentHandler = new ContentHandlerWrapper(serializer, serializer);
contentHandler.startDocument();
// TODO is root element necessary for TextSerializer?
contentHandler.startElement(JXTemplateGenerator.NS, elementName, elementName, EMPTY_ATTRS);
Invoker.execute(contentHandler, expressionContext, executionContext, macroContext, this.getNext(), this
.getEndInstruction());
contentHandler.endElement(JXTemplateGenerator.NS, elementName, elementName);
contentHandler.endDocument();
valueStr = writer.toString();
}
} catch (Exception exc) {
throw new SAXParseException(exc.getMessage(), getLocation(), exc);
}
if (consumer instanceof AttributeAwareXMLConsumer) {
AttributeAwareXMLConsumer c = (AttributeAwareXMLConsumer) consumer;
c.attribute("", nameStr, nameStr, "CDATA", valueStr == null ? "" : valueStr);
} else
throw new SAXParseException("consumer is not attribute aware", getLocation());
return getEndInstruction().getNext();
}
}