/* * 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(); } }