/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.plsql.rule;
import java.util.List;
import java.util.logging.Logger;
import net.sourceforge.pmd.RuleContext;
import net.sourceforge.pmd.lang.LanguageRegistry;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.plsql.PLSQLLanguageModule;
import net.sourceforge.pmd.lang.plsql.ast.*;
import net.sourceforge.pmd.lang.rule.AbstractRule;
import net.sourceforge.pmd.lang.rule.ImmutableLanguage;
public abstract class AbstractPLSQLRule extends AbstractRule implements PLSQLParserVisitor, ImmutableLanguage {
private static final Logger LOGGER = Logger.getLogger(AbstractPLSQLRule.class.getName());
private static final String CLASS_NAME = AbstractPLSQLRule.class.getName();
public AbstractPLSQLRule() {
super.setLanguage(LanguageRegistry.getLanguage(PLSQLLanguageModule.NAME));
// Enable Type Resolution on PLSQL Rules by default
super.setUsesTypeResolution();
}
@Override
public void apply(List<? extends Node> nodes, RuleContext ctx) {
visitAll(nodes, ctx);
}
protected void visitAll(List<? extends Node> nodes, RuleContext ctx) {
LOGGER.entering(CLASS_NAME, "visitAll");
for (Object element : nodes) {
ASTInput node = (ASTInput) element;
visit(node, ctx);
}
LOGGER.exiting(CLASS_NAME, "visitAll");
}
/**
* Gets the Image of the first parent node of type
* ASTClassOrInterfaceDeclaration or <code>null</code>
*
* @param node
* the node which will be searched
*/
protected final String getDeclaringType(Node node) {
Node c;
/*
* Choose the Object Type
*/
c = node.getFirstParentOfType(ASTPackageSpecification.class);
if (c != null) {
return c.getImage();
}
c = node.getFirstParentOfType(ASTTypeSpecification.class);
if (c != null) {
return c.getImage();
}
c = node.getFirstParentOfType(ASTPackageBody.class);
if (c != null) {
return c.getImage();
}
c = node.getFirstParentOfType(ASTTriggerUnit.class);
if (c != null) {
return c.getImage();
}
// Finally Schema-level Methods
c = node.getFirstParentOfType(ASTProgramUnit.class);
if (c != null) {
return c.getImage();
}
return null;
}
public static boolean isQualifiedName(Node node) {
return node.getImage().indexOf('.') != -1;
}
public static boolean importsPackage(ASTInput node, String packageName) {
return false;
}
/*
* Duplicate PLSQLParserVisitor API
*/
@Override
public Object visit(PLSQLNode node, Object data) {
node.childrenAccept(this, data);
return null;
}
@Override
public Object visit(ASTInput node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTDDLCommand node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTSqlPlusCommand node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTGlobal node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTBlock node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTPackageSpecification node, Object data) {
LOGGER.entering(CLASS_NAME, "visit(ASTPackageSpecification)");
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTPackageBody node, Object data) {
LOGGER.entering(CLASS_NAME, "visit(ASTPackageBody)");
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTDeclarativeUnit node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTDeclarativeSection node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTCompilationDeclarationFragment node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTProgramUnit node, Object data) {
LOGGER.entering(CLASS_NAME, "visit(ASTProgramUnit)");
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTObjectNameDeclaration node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTFormalParameter node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTMethodDeclaration node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTMethodDeclarator node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTFormalParameters node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTVariableOrConstantDeclarator node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTVariableOrConstantDeclaratorId node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTVariableOrConstantInitializer node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTDatatype node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTCompilationDataType node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTCollectionTypeName node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTScalarDataTypeName node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTDateTimeLiteral node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTExceptionHandler node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTSkip2NextTerminator node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTSkip2NextOccurrence node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTSkipPastNextOccurrence node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTSkip2NextTokenOccurrence node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTSkipPastNextTokenOccurrence node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTRead2NextOccurrence node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTReadPastNextOccurrence node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTSqlStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTWrappedObject node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTUnlabelledStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTLabelledStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTCaseStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTCaseWhenClause node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTElseClause node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTElsifClause node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTLoopStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTForStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTWhileStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTIfStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTForIndex node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTForAllIndex node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTForAllStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTGotoStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTReturnStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTContinueStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTExitStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTRaiseStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTCloseStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTOpenStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTFetchStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTEmbeddedSqlStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTPipelineStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTConditionalCompilationStatement node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTSubTypeDefinition node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTFieldDeclaration node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTCollectionTypeDefinition node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTCollectionDeclaration node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTObjectDeclaration node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTCallSpecTail node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTCursorUnit node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTCursorSpecification node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTCursorBody node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTExpression node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTCompilationExpression node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTAssignment node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTCaseExpression node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTLikeExpression node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTTrimExpression node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTObjectExpression node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTConditionalOrExpression node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTConditionalAndExpression node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTEqualityExpression node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTRelationalExpression node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTAdditiveExpression node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTStringExpression node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTMultiplicativeExpression node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTUnaryExpression node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTUnaryExpressionNotPlusMinus node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTPrimaryExpression node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTPrimaryPrefix node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTPrimarySuffix node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTLiteral node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTStringLiteral node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTBooleanLiteral node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTNullLiteral node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTMultiSetCondition node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTNumericLiteral node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTLabel node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTName node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTQualifiedName node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTArguments node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTArgumentList node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTArgument node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTVariableOrConstantDeclaration node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTDatatypeDeclaration node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTPragma node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTExceptionDeclaration node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTParallelClause node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTTable node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTTableColumn node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTView node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTSynonym node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTDirectory node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTDatabaseLink node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTViewColumn node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTComment node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTTypeMethod node, Object data) {
LOGGER.entering(CLASS_NAME, "visit(ASTTypeMethod)");
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTTypeSpecification node, Object data) {
LOGGER.entering(CLASS_NAME, "visit(ASTTypeSpecification)");
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTAlterTypeSpec node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTAttributeDeclaration node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTAttribute node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTPragmaClause node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTInlinePragma node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTTriggerUnit node, Object data) {
LOGGER.entering(CLASS_NAME, "visit(ASTTriggerUnit)");
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTTriggerTimingPointSection node, Object data) {
LOGGER.entering(CLASS_NAME, "visit(ASTTriggerTimingPointSection)");
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTCompoundTriggerBlock node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTNonDMLTrigger node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTDDLEvent node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTDatabaseEvent node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTNonDMLEvent node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTAlterTrigger node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTKEYWORD_RESERVED node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTKEYWORD_UNRESERVED node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTID node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTUnqualifiedID node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTQualifiedID node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTTypeKeyword node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTJavaInterfaceClass node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTEqualsOldIDNewID node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTAccessibleByClause node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTIsOfTypeCondition node, Object data) {
return visit((PLSQLNode) node, data);
}
@Override
public Object visit(ASTIsNullCondition node, Object data) {
return visit((PLSQLNode) node, data);
}
/*
* Treat all Executable Code
*/
public Object visit(ExecutableCode node, Object data) {
LOGGER.entering(CLASS_NAME, "visit(ExecutableCode)");
return visit((PLSQLNode) node, data);
}
}