/** * Copyright (C) 2010 Orbeon, Inc. * * This program is free software; you can redistribute it and/or modify it under the terms of the * GNU Lesser General Public License as published by the Free Software Foundation; either version * 2.1 of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU Lesser General Public License for more details. * * The full text of the license is available at http://www.gnu.org/copyleft/lesser.html */ package org.orbeon.oxf.processor.pipeline.ast; import org.orbeon.dom.*; import org.orbeon.oxf.processor.pipeline.PipelineProcessor; import org.orbeon.oxf.processor.pipeline.foreach.AbstractForEachProcessor; import java.util.*; public class ASTDocumentHandler implements ASTHandler { private Document document = DocumentFactory.createDocument(); private Element currentElement; private Stack href; public boolean startPipeline(ASTPipeline pipeline) { currentElement = DocumentFactory.createElement(QName.get("config", PipelineProcessor.PIPELINE_NAMESPACE)); document.setRootElement(currentElement); return true; } public void endPipeline(ASTPipeline pipeline) { } public void param(ASTParam param) { Element paramElement = currentElement.addElement(QName.get("param", PipelineProcessor.PIPELINE_NAMESPACE)); paramElement.addAttribute("type", param.getType() == ASTParam.INPUT ? "input" : "output"); paramElement.addAttribute("name", param.getName()); } public boolean startProcessorCall(ASTProcessorCall processorCall) { currentElement = currentElement.addElement(QName.get("processor", PipelineProcessor.PIPELINE_NAMESPACE)); if (processorCall.getName() != null) { currentElement.addAttribute("name", processorCall.getName().getQualifiedName()); } else { currentElement.addAttribute("class", processorCall.getProcessor().getClass().getName()); } return true; } public void endProcessorCall(ASTProcessorCall processorCall) { currentElement = currentElement.getParent(); } public boolean startInput(ASTInput input) { href = new Stack(); return true; } public void endInput(ASTInput input) { Element inputElement = currentElement.addElement(QName.get("input", PipelineProcessor.PIPELINE_NAMESPACE)); inputElement.addAttribute("name", input.getName()); if (!href.isEmpty()) inputElement.addAttribute("href", (String) href.pop()); if (input.getContent() != null) { if (input.getContent() instanceof Document) { inputElement.add(((Document) input.getContent()).getRootElement().createCopy()); } else { inputElement.add((Node) input.getContent().clone()); } } } public void output(ASTOutput output) { Element outputElement = currentElement.addElement(QName.get("output", PipelineProcessor.PIPELINE_NAMESPACE)); outputElement.addAttribute("name", output.getName()); if (output.getRef() != null) outputElement.addAttribute("ref", output.getRef()); if (output.getId() != null) outputElement.addAttribute("id", output.getId()); } public boolean startHrefAggregate(ASTHrefAggregate hrefAggregate) { return true; } public void endHrefAggregate(ASTHrefAggregate hrefAggregate) { StringBuilder result = new StringBuilder("aggregate('" + hrefAggregate.getRoot() + "'"); // Get arguments from stack List hrefs = new ArrayList(); for (int i = 0; i < hrefAggregate.getHrefs().size(); i++) hrefs.add(href.pop()); Collections.reverse(hrefs); // Add arguments in correct order for (Iterator i = hrefs.iterator(); i.hasNext();) { result.append(", "); result.append((String) i.next()); } href.push(result.toString()); } public void hrefId(ASTHrefId hrefId) { href.push(AbstractForEachProcessor.FOR_EACH_CURRENT_INPUT.equals(hrefId.getId()) ? "current()" : "#" + hrefId.getId()); } public void hrefURL(ASTHrefURL hrefURL) { href.push(hrefURL.getURL()); } public boolean startHrefXPointer(ASTHrefXPointer hrefXPointer) { return true; } public void endHrefXPointer(ASTHrefXPointer hrefXPointer) { String result = (String) href.pop() + "#xpointer(" + hrefXPointer.getXpath() + ")"; href.push(result); } public boolean startChoose(ASTChoose choose) { href = new Stack(); currentElement = currentElement.addElement(QName.get("choose", PipelineProcessor.PIPELINE_NAMESPACE)); return true; } public void endChoose(ASTChoose choose) { currentElement = currentElement.getParent(); } public boolean startForEach(ASTForEach forEach) { href = new Stack(); currentElement = currentElement.addElement(QName.get("for-each", PipelineProcessor.PIPELINE_NAMESPACE)); if (forEach.getId() != null) currentElement.addAttribute("id", forEach.getId()); if (forEach.getRef() != null) currentElement.addAttribute("ref", forEach.getRef()); currentElement.addAttribute("root", forEach.getRoot()); return true; } public void endStartForEach(ASTForEach forEach) { } public void endForEach(ASTForEach forEach) { currentElement = currentElement.getParent(); } public boolean startWhen(ASTWhen when) { if (currentElement.elements().isEmpty()) { currentElement.addAttribute("href", (String) href.pop()); } if (when.getTest() == null) { currentElement = currentElement.addElement(QName.get("otherwise", PipelineProcessor.PIPELINE_NAMESPACE)); } else { currentElement = currentElement.addElement(QName.get("when", PipelineProcessor.PIPELINE_NAMESPACE)); currentElement.addAttribute("test", when.getTest()); } return true; } public void endWhen(ASTWhen when) { currentElement = currentElement.getParent(); } public Document getDocument() { return document; } }