package husacct.analyse.task.analyse.java.analysing; import java.util.List; import husacct.analyse.task.analyse.java.parsing.JavaParser.BlockContext; import husacct.analyse.task.analyse.java.parsing.JavaParser.BlockStatementContext; import husacct.analyse.task.analyse.java.parsing.JavaParser.CatchClauseContext; import husacct.analyse.task.analyse.java.parsing.JavaParser.ExpressionContext; import husacct.analyse.task.analyse.java.parsing.JavaParser.ResourceContext; import husacct.analyse.task.analyse.java.parsing.JavaParser.StatementContext; import husacct.analyse.task.analyse.java.parsing.JavaParser.SwitchBlockStatementGroupContext; import husacct.analyse.task.analyse.java.parsing.JavaParser.SwitchLabelContext; import org.apache.log4j.Logger; public class BlockAnalyser extends JavaGenerator { private String belongsToClass; private String belongsToMethod; private String to = ""; private int lineNumber; private Logger logger = Logger.getLogger(BlockAnalyser.class); // Analyses a BlockContext, in order of the definition of "block" in Java.g4. public BlockAnalyser(BlockContext block, String belongsToClass, String belongsToMethod) { this.belongsToClass = belongsToClass; this.belongsToMethod = belongsToMethod; try { for (BlockStatementContext blockStatement : block.blockStatement()) { analyseBlockStatement(blockStatement); } } catch (Exception e) { logger.warn(" Exception while processing: " + belongsToClass + " Line: " + block.start.getLine() + " " + e.getMessage()); } } // Analyses a BlockStatementContext, in order of the definition of "block" in Java.g4. private void analyseBlockStatement(BlockStatementContext blockStatement) { /* Test helper if (belongsToClass.contains("domain.direct.violating.DeclarationReturnType")) { boolean breakpoint = true; } */ if (blockStatement.localVariableDeclarationStatement() != null && blockStatement.localVariableDeclarationStatement().localVariableDeclaration() != null) { VariableAnalyser variableAnalyser = new VariableAnalyser(this.belongsToClass); variableAnalyser.analyseLocalVariable(blockStatement.localVariableDeclarationStatement().localVariableDeclaration(), this.belongsToMethod); } else if (blockStatement.statement() != null) { analyseStatement(blockStatement.statement()); } else if (blockStatement.typeDeclaration() != null) { TypeDeclarationAnalyser typeDeclarationAnalyser = new TypeDeclarationAnalyser(); typeDeclarationAnalyser.analyseNestedTypeDeclaration(blockStatement.typeDeclaration(), belongsToClass); } } // Analyses a StatementContext, in order of the definition of "statement" in Java.g4. private void analyseStatement(StatementContext statement) { /* Test helper String rs = statement.getText(); if (belongsToClass.contains("CSharpTreeConvertController") && (statement.start.getLine() == 58)) { boolean breakpoint = true; } */ if (statement.block() != null) { new BlockAnalyser(statement.block(), this.belongsToClass, this.belongsToMethod); } if ((statement.statement() != null) && !statement.statement().isEmpty()) { for (StatementContext subStatement : statement.statement()) { analyseStatement(subStatement); } } if ((statement.expression() != null) && !statement.expression().isEmpty()) { for (ExpressionContext subExpression : statement.expression()) { new ExpressionAnalyser(belongsToClass, belongsToMethod, subExpression); } } if ((statement.statementExpression() != null) && (statement.statementExpression().expression() != null)) { new ExpressionAnalyser(belongsToClass, belongsToMethod, statement.statementExpression().expression()); } if ((statement.parExpression() != null) && (statement.parExpression().expression() != null)) { new ExpressionAnalyser(belongsToClass, belongsToMethod, statement.parExpression().expression()); } if (statement.forControl() != null) { if (statement.forControl().expression() != null) { new ExpressionAnalyser(belongsToClass, belongsToMethod, statement.forControl().expression()); if (statement.forControl().forInit() != null) { // To do! } if (statement.forControl().forUpdate() != null) { // To do! } } else if (statement.forControl().enhancedForControl() != null) { if (statement.forControl().enhancedForControl().typeType() != null) { VariableAnalyser variableAnalyser = new VariableAnalyser(this.belongsToClass); variableAnalyser.analyseForControlVariable(statement.forControl().enhancedForControl(), this.belongsToMethod); } if (statement.forControl().enhancedForControl().expression() != null) { new ExpressionAnalyser(belongsToClass, belongsToMethod, statement.forControl().enhancedForControl().expression()); } } } if ((statement.catchClause() != null) && !statement.catchClause().isEmpty()) { for (CatchClauseContext catchClause : statement.catchClause()) { VariableAnalyser variableAnalyser = new VariableAnalyser(this.belongsToClass); variableAnalyser.analyseCatchClauseVariable(catchClause, this.belongsToMethod); if (catchClause.block() != null) { new BlockAnalyser(catchClause.block(), this.belongsToClass, this.belongsToMethod); } } } if (statement.finallyBlock() != null) { if (statement.finallyBlock().block() != null){ new BlockAnalyser(statement.finallyBlock().block(), this.belongsToClass, this.belongsToMethod); } } if ((statement.resourceSpecification() != null) && (statement.resourceSpecification().resources() != null) && (statement.resourceSpecification().resources().resource() != null) && !statement.resourceSpecification().resources().resource().isEmpty()) { for (ResourceContext resource : statement.resourceSpecification().resources().resource()) { VariableAnalyser variableAnalyser = new VariableAnalyser(this.belongsToClass); variableAnalyser.analyseResourceVariable(resource, this.belongsToMethod); if (resource.expression() != null) { new ExpressionAnalyser(belongsToClass, belongsToMethod, resource.expression()); } } } if ((statement.switchBlockStatementGroup() != null) && !statement.switchBlockStatementGroup().isEmpty()) { for (SwitchBlockStatementGroupContext switchBlockStatementGroup : statement.switchBlockStatementGroup()) { if ((switchBlockStatementGroup.switchLabel() != null) && !switchBlockStatementGroup.switchLabel().isEmpty()) { analyseSwitchLabel(switchBlockStatementGroup.switchLabel()); } if ((switchBlockStatementGroup.blockStatement() != null) && !switchBlockStatementGroup.blockStatement().isEmpty()) { for (BlockStatementContext blockStatement : switchBlockStatementGroup.blockStatement()) { analyseBlockStatement(blockStatement); } } } } if ((statement.switchLabel() != null) && !statement.switchLabel().isEmpty()) { analyseSwitchLabel(statement.switchLabel()); } if (statement.Identifier() != null) { this.lineNumber = statement.start.getLine(); this.to = statement.Identifier().getText(); addAssociationToModel(); } } private void addAssociationToModel() { if ((to != null) && !to.trim().equals("") && !SkippedJavaTypes.isSkippable(to)) { modelService.createVariableInvocation(belongsToClass, to, lineNumber, belongsToMethod); } to = ""; lineNumber = 0; } private void analyseSwitchLabel(List<SwitchLabelContext> switchLabelList) { for(SwitchLabelContext switchLabel : switchLabelList) { if((switchLabel.constantExpression() != null) && (switchLabel.constantExpression().expression() != null)) { new ExpressionAnalyser(belongsToClass, belongsToMethod, switchLabel.constantExpression().expression()); } if((switchLabel.enumConstantName() != null) && (switchLabel.enumConstantName().Identifier() != null)) { this.lineNumber = switchLabel.enumConstantName().start.getLine(); this.to = switchLabel.enumConstantName().Identifier().getText(); addAssociationToModel(); } } } }