/*
* Copyright 2012 PRODYNA AG
*
* Licensed under the Eclipse Public License (EPL), Version 1.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.opensource.org/licenses/eclipse-1.0.php or
* http://www.nabucco.org/License.html
*
* 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.nabucco.framework.generator.compiler.transformation.confluence;
import org.nabucco.framework.generator.compiler.transformation.confluence.annotation.NabuccoToConfluenceAnnotationVisitor;
import org.nabucco.framework.generator.compiler.transformation.confluence.signature.NabuccoSignatureDeclarationVisitor;
import org.nabucco.framework.generator.compiler.transformation.confluence.utils.NabuccoToConfluenceTableContainer;
import org.nabucco.framework.generator.compiler.transformation.confluence.utils.NabuccoToConfluenceTableRow;
import org.nabucco.framework.generator.compiler.transformation.confluence.utils.NabuccoToConfluenceTableSpaltenEnum;
import org.nabucco.framework.generator.compiler.transformation.confluence.visitor.NabuccoToConfluenceVisitor;
import org.nabucco.framework.generator.compiler.transformation.confluence.visitor.NabuccoToConfluenceVisitorContext;
import org.nabucco.framework.generator.parser.syntaxtree.Node;
import org.nabucco.framework.mda.model.MdaModel;
import org.nabucco.framework.mda.model.text.confluence.ConfluenceModel;
import org.nabucco.framework.mda.model.text.confluence.ast.ConfluenceComposite;
import org.nabucco.framework.mda.model.text.confluence.ast.ConfluenceElement;
import org.nabucco.framework.mda.model.text.confluence.ast.format.ConfluenceLine;
import org.nabucco.framework.mda.model.text.confluence.ast.heading.ConfluenceHeading;
import org.nabucco.framework.mda.model.text.confluence.ast.heading.ConfluenceHeadingSize;
import org.nabucco.framework.mda.model.text.confluence.ast.link.ConfluenceLocalAnchor;
import org.nabucco.framework.mda.model.text.confluence.ast.page.ConfluencePagePart;
import org.nabucco.framework.mda.model.text.confluence.ast.table.ConfluenceTable;
import org.nabucco.framework.mda.model.text.confluence.ast.table.ConfluenceTableRow;
import org.nabucco.framework.mda.model.text.confluence.ast.table.ConfluenceTableRowContent;
import org.nabucco.framework.mda.model.text.confluence.ast.text.ConfluenceText;
import org.nabucco.framework.mda.model.text.confluence.ast.text.ConfluenceTextEffect;
/**
* NabuccoToConfluenceDeclarationVisitor
*
* @author Leonid Agranovskiy, PRODYNA AG
*/
public abstract class NabuccoToConfluenceDeclarationVisitor extends NabuccoToConfluenceVisitor {
protected ConfluencePagePart memberParts;
/**
* Creates a new {@link NabuccoToConfluenceDeclarationVisitor} instance.
*
* @param visitorContext
*/
public NabuccoToConfluenceDeclarationVisitor(NabuccoToConfluenceVisitorContext visitorContext) {
super(visitorContext);
}
/**
* Generates a local info part for a Node
*
* @param name
* Name of a node
* @param n
* Node
* @param argu
* Target
* @return Anchor for the local link
*/
protected ConfluenceLocalAnchor generateInfoPart(String name, Node n, MdaModel<ConfluenceModel> argu,
boolean printSignature) {
// generate informational part
ConfluencePagePart part = new ConfluencePagePart();
part.addElement(new ConfluenceLine());
ConfluenceHeading header = new ConfluenceHeading(ConfluenceHeadingSize.H4);
header.addElement(new ConfluenceText(name));
part.addElement(header);
ConfluenceLocalAnchor anchor = new ConfluenceLocalAnchor(name);
part.addElement(anchor);
// Signature
if (printSignature) {
StringBuilder signatureBuilder = new StringBuilder();
NabuccoSignatureDeclarationVisitor signatureVisitor = new NabuccoSignatureDeclarationVisitor(
this.getVisitorContext(), signatureBuilder);
n.accept(signatureVisitor, argu);
ConfluenceText signatureCode = new ConfluenceText(signatureBuilder.toString().trim(),
ConfluenceTextEffect.CODE);
part.addElement(signatureCode);
part.addElement(new ConfluenceText(ConfluenceTextEffect.NEWLINE));
}
// Annotations
NabuccoToConfluenceAnnotationVisitor declarationVisitor = new NabuccoToConfluenceAnnotationVisitor(
this.getVisitorContext(), part, false);
declarationVisitor.setHeadingSize(ConfluenceHeadingSize.H5);
n.accept(declarationVisitor, argu);
this.memberParts.addElement(part);
return anchor;
}
/**
* Returns the content of the Element
*
* @param n
* Node to print
* @param argu
* target
* @return
*/
protected String readElementContent(Node n, MdaModel<ConfluenceModel> argu) {
StringBuilder retVal = new StringBuilder();
NabuccoSignatureDeclarationVisitor parameterVisitor = new NabuccoSignatureDeclarationVisitor(
this.getVisitorContext(), retVal);
n.accept(parameterVisitor, argu);
return retVal.toString();
}
/**
* writes all rows to a table
*
* @param element
* element to write table
* @param datatContainer
* datat to write
*/
protected void createTable(ConfluenceComposite element, NabuccoToConfluenceTableContainer dataContainer) {
this.createTable(element, dataContainer, null);
}
/**
* writes all rows to a table
*
* @param element
* element to write table
* @param datatContainer
* datat to write
*/
protected void createTable(ConfluenceComposite element, NabuccoToConfluenceTableContainer dataContainer,
String header) {
// Print header
if (!dataContainer.getColumns().isEmpty()) {
if (header != null) {
ConfluenceHeading tableHeader = new ConfluenceHeading(ConfluenceHeadingSize.H4);
tableHeader.addElement(new ConfluenceText(header));
element.addElement(tableHeader);
}
ConfluenceTable table = new ConfluenceTable();
ConfluenceTableRow headerRow = new ConfluenceTableRow(true);
for (NabuccoToConfluenceTableSpaltenEnum column : dataContainer.getColumns()) {
headerRow.addElement(new ConfluenceTableRowContent(new ConfluenceText(column.getValue())));
}
table.addElement(headerRow);
// Iterate rows of data
for (NabuccoToConfluenceTableRow row : dataContainer.getRows()) {
ConfluenceTableRow tableRow = new ConfluenceTableRow(false);
// Iterate columns
for (NabuccoToConfluenceTableSpaltenEnum column : dataContainer.getColumns()) {
ConfluenceElement confElement = row.getValue(column);
tableRow.addElement(new ConfluenceTableRowContent(confElement));
}
table.addElement(tableRow);
}
element.addElement(table);
}
}
}