/*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
*
* Copyright 2008 jOpenDocument, by ILM Informatique. All rights reserved.
*
* The contents of this file are subject to the terms of the GNU
* General Public License Version 3 only ("GPL").
* You may not use this file except in compliance with the License.
* You can obtain a copy of the License at http://www.gnu.org/licenses/gpl-3.0.html
* See the License for the specific language governing permissions and limitations under the License.
*
* When distributing the software, include this License Header Notice in each file.
*
*/
package org.jopendocument.dom.template.statements;
import org.jopendocument.dom.template.TemplateException;
import org.jopendocument.dom.template.engine.DataModel;
import org.jopendocument.dom.template.engine.Processor;
import java.util.ArrayList;
import java.util.List;
import org.jdom.Content;
import org.jdom.Element;
/**
* If tag: conditionally displays a document element. <br>
* Attributes:
* <ul>
* <li><b>element </b> (required): the document element to which this tag applies, e.g. "table-row"
* </li>
* <li><b>test </b> (required): expression that must be true for the element to be displayed</li>
* </ul>
*/
public class If extends BaseStatement {
public If() {
super("if");
}
@SuppressWarnings("unchecked")
public void prepare(Element script, Element command) throws TemplateException {
String elementName = command.getAttributeValue("element");
if (elementName == null)
throw new TemplateException("missing required attribute for if tag: element");
String testExpression = command.getAttributeValue("test");
if (testExpression == null)
throw new TemplateException("missing required attribute for if tag: test");
Element target = getAncestorByName(script, elementName);
if (target == null) {
throw new TemplateException("no such element enclosing if tag: " + elementName + " for expression: " + testExpression);
}
Element parent = target.getParentElement();
// Element ifTag = parent.addElement(getQName("if")).addAttribute("test",
// testExpression);
// parent.remove(ifTag);
final Element ifTag = getElement(this.getName()).setAttribute("test", testExpression);
int index = parent.indexOf(target);
target.detach();
parent.getContent().add(index, ifTag);
ifTag.addContent(target);
script.detach();
}
@SuppressWarnings("unchecked")
public void execute(Processor processor, Element tag, DataModel model) throws TemplateException {
String testExpression = tag.getAttributeValue("test");
if (testExpression != null) {
Object value = model.eval(testExpression);
if (Boolean.TRUE.equals(value)) {
final List<Content> parentContent = tag.getParentElement().getContent();
final int index = parentContent.indexOf(tag);
// copy cause the list is live, and we're about to remove its content
final List<Element> children = new ArrayList<Element>(tag.getChildren());
// change the parent of the children
parentContent.addAll(index, tag.removeContent());
// then transform, see ForEach
for (final Element target : children) {
processor.transform(target);
removeSection(target);
}
}
}
tag.detach();
}
}