/* * 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.verifier.common; import java.util.Map; import org.nabucco.framework.generator.compiler.transformation.common.annotation.NabuccoAnnotation; import org.nabucco.framework.generator.compiler.transformation.common.annotation.NabuccoAnnotationMapper; import org.nabucco.framework.generator.compiler.transformation.common.annotation.NabuccoAnnotationType; import org.nabucco.framework.generator.compiler.verifier.NabuccoModelVerificationVisitor; import org.nabucco.framework.generator.compiler.verifier.error.VerificationErrorCriticality; import org.nabucco.framework.generator.compiler.verifier.error.VerificationResult; import org.nabucco.framework.generator.parser.syntaxtree.AdapterStatement; import org.nabucco.framework.generator.parser.syntaxtree.AnnotationDeclaration; import org.nabucco.framework.generator.parser.syntaxtree.ApplicationStatement; import org.nabucco.framework.generator.parser.syntaxtree.BasetypeDeclaration; import org.nabucco.framework.generator.parser.syntaxtree.BasetypeStatement; import org.nabucco.framework.generator.parser.syntaxtree.CommandStatement; import org.nabucco.framework.generator.parser.syntaxtree.ComponentDatatypeDeclaration; import org.nabucco.framework.generator.parser.syntaxtree.ComponentDeclaration; import org.nabucco.framework.generator.parser.syntaxtree.ComponentStatement; import org.nabucco.framework.generator.parser.syntaxtree.ConnectorDeclaration; import org.nabucco.framework.generator.parser.syntaxtree.ConnectorStatement; import org.nabucco.framework.generator.parser.syntaxtree.DatatypeDeclaration; import org.nabucco.framework.generator.parser.syntaxtree.DatatypeStatement; import org.nabucco.framework.generator.parser.syntaxtree.EnumerationDeclaration; import org.nabucco.framework.generator.parser.syntaxtree.EnumerationStatement; import org.nabucco.framework.generator.parser.syntaxtree.ExceptionStatement; import org.nabucco.framework.generator.parser.syntaxtree.MessageStatement; import org.nabucco.framework.generator.parser.syntaxtree.MethodDeclaration; import org.nabucco.framework.generator.parser.syntaxtree.Node; import org.nabucco.framework.generator.parser.syntaxtree.NodeToken; import org.nabucco.framework.generator.parser.syntaxtree.ServiceDeclaration; import org.nabucco.framework.generator.parser.syntaxtree.ServiceStatement; /** * NabuccoDocumentationVarification * * @author Leonid Agranovskiy, PRODYNA AG */ public class NabuccoDocumentationVarification extends NabuccoModelVerificationVisitor { private static final String PROPERTY = "property"; private static final String STATEMENT = "statement"; @Override public void visit(AdapterStatement n, VerificationResult result) { this.checkStatementAnnotation(n.annotationDeclaration, n.nodeToken2, result); super.visit(n, result); } @Override public void visit(ApplicationStatement n, VerificationResult result) { this.checkStatementAnnotation(n.annotationDeclaration, n.nodeToken2, result); super.visit(n, result); } @Override public void visit(BasetypeStatement n, VerificationResult result) { this.checkStatementAnnotation(n.annotationDeclaration, n.nodeToken2, result); super.visit(n, result); } @Override public void visit(CommandStatement n, VerificationResult result) { this.checkStatementAnnotation(n.annotationDeclaration, n.nodeToken2, result); super.visit(n, result); } @Override public void visit(ComponentStatement n, VerificationResult result) { this.checkStatementAnnotation(n.annotationDeclaration, n.nodeToken2, result); super.visit(n, result); } @Override public void visit(ConnectorStatement n, VerificationResult result) { this.checkStatementAnnotation(n.annotationDeclaration, n.nodeToken2, result); super.visit(n, result); } @Override public void visit(DatatypeStatement n, VerificationResult result) { this.checkStatementAnnotation(n.annotationDeclaration, n.nodeToken2, result); super.visit(n, result); } @Override public void visit(EnumerationStatement n, VerificationResult result) { this.checkStatementAnnotation(n.annotationDeclaration, n.nodeToken2, result); super.visit(n, result); } @Override public void visit(ExceptionStatement n, VerificationResult result) { this.checkStatementAnnotation(n.annotationDeclaration, n.nodeToken2, result); super.visit(n, result); } @Override public void visit(MessageStatement n, VerificationResult result) { this.checkStatementAnnotation(n.annotationDeclaration, n.nodeToken2, result); super.visit(n, result); } @Override public void visit(ServiceStatement n, VerificationResult result) { this.checkStatementAnnotation(n.annotationDeclaration, n.nodeToken2, result); super.visit(n, result); } @Override public void visit(BasetypeDeclaration n, VerificationResult result) { this.checkDeclarationAnnotation(n.annotationDeclaration, n.nodeToken1, result); super.visit(n, result); } @Override public void visit(ComponentDatatypeDeclaration n, VerificationResult result) { this.checkDeclarationAnnotation(n.annotationDeclaration, n.nodeToken2, result); super.visit(n, result); } @Override public void visit(ComponentDeclaration n, VerificationResult result) { this.checkDeclarationAnnotation(n.annotationDeclaration, n.nodeToken2, result); super.visit(n, result); } @Override public void visit(ConnectorDeclaration n, VerificationResult result) { this.checkDeclarationAnnotation(n.annotationDeclaration, n.nodeToken2, result); super.visit(n, result); } @Override public void visit(DatatypeDeclaration n, VerificationResult result) { this.checkDeclarationAnnotation(n.annotationDeclaration, n.nodeToken2, result); super.visit(n, result); } @Override public void visit(EnumerationDeclaration n, VerificationResult result) { this.checkDeclarationAnnotation(n.annotationDeclaration, n.nodeToken2, result); super.visit(n, result); } @Override public void visit(MethodDeclaration n, VerificationResult result) { this.checkDeclarationAnnotation(n.annotationDeclaration, n.nodeToken1, result); super.visit(n, result); } @Override public void visit(ServiceDeclaration n, VerificationResult result) { this.checkDeclarationAnnotation(n.annotationDeclaration, n.nodeToken1, result); super.visit(n, result); } /** * Check if the statement annotation is documented enough * * @param annotation * annotation * @param owner * statement * @param result * errors list */ private void checkStatementAnnotation(AnnotationDeclaration annotation, NodeToken owner, VerificationResult result) { Map<NabuccoAnnotationType, NabuccoAnnotation> annotationsMap = NabuccoAnnotationMapper.getInstance() .convertAnnotationsToMap(annotation); for (Node node : annotation.nodeListOptional.nodes) { NodeToken annotationNode = (NodeToken) node; String annotationName = annotationNode.tokenImage; if (!NabuccoAnnotationMapper.getInstance().isAnnotation(annotationName)) { } } if (!annotationsMap.containsKey(NabuccoAnnotationType.DESCRIPTION)) { createWarning(NabuccoAnnotationType.DESCRIPTION, owner, STATEMENT, result); } if (!annotationsMap.containsKey(NabuccoAnnotationType.AUTHOR)) { createWarning(NabuccoAnnotationType.AUTHOR, owner, STATEMENT, result); } if (!annotationsMap.containsKey(NabuccoAnnotationType.COMPANY)) { createWarning(NabuccoAnnotationType.COMPANY, owner, STATEMENT, result); } if (!annotationsMap.containsKey(NabuccoAnnotationType.VERSION)) { createWarning(NabuccoAnnotationType.VERSION, owner, STATEMENT, result); } if (!annotationsMap.containsKey(NabuccoAnnotationType.DATE)) { createWarning(NabuccoAnnotationType.VERSION, owner, STATEMENT, result); } } /** * Check declaration if it is annotated enough. Warning if it has no description * * @param annotation * annotation node * @param owner * declaration * @param result * errors list */ private void checkDeclarationAnnotation(AnnotationDeclaration annotation, NodeToken owner, VerificationResult result) { NabuccoAnnotation descriptionAnnotations = NabuccoAnnotationMapper.getInstance().mapToAnnotation(annotation, NabuccoAnnotationType.DESCRIPTION); if (descriptionAnnotations == null) { createWarning(NabuccoAnnotationType.DESCRIPTION, owner, PROPERTY, result); } } /** * Creates a warning about a missing annotation * * @param annotationType * type if missing annotation * @param owner * owner nodetoken of the annotation * @param type * property or statement * @param result * errors list */ private void createWarning(NabuccoAnnotationType annotationType, NodeToken owner, String type, VerificationResult result) { int beginLine = owner.beginLine; int endLine = owner.endLine; int beginColumn = owner.beginColumn; int endColumn = owner.endColumn; result.addError(VerificationErrorCriticality.WARNING, beginLine, endLine, beginColumn, endColumn, " Missing annotation @", annotationType.getName(), " in ", type, " ", owner.tokenImage, "."); } }