package husacct.analyse.task.analyse.java.analysing; import java.util.List; import org.antlr.v4.runtime.tree.TerminalNode; import husacct.analyse.domain.IModelCreationService; import husacct.analyse.domain.famix.FamixCreationServiceImpl; import husacct.analyse.task.analyse.VisibilitySet; import husacct.analyse.task.analyse.java.parsing.JavaParser; import husacct.analyse.task.analyse.java.parsing.JavaParser.ModifierContext; import husacct.analyse.task.analyse.java.parsing.JavaParser.TypeArgumentContext; import husacct.analyse.task.analyse.java.parsing.JavaParser.TypeArgumentsContext; import husacct.analyse.task.analyse.java.parsing.JavaParser.TypeTypeContext; abstract class JavaGenerator { protected IModelCreationService modelService = new FamixCreationServiceImpl(); protected String determineVisibility(List<ModifierContext> modifierList) { String visibility = VisibilitySet.DEFAULT.toString(); if (modifierList != null) { for (ModifierContext modifier : modifierList) { if (VisibilitySet.isValidVisibillity(modifier.getText())) { visibility = modifier.getText(); } } } return visibility; } protected boolean determineIsAbstract(List<ModifierContext> modifierList) { boolean isAbstract = false; if (modifierList != null) { for (ModifierContext modifier : modifierList) { if (modifier.getText().equals("abstract")) { isAbstract = true; } } } return isAbstract; } protected boolean determineIsFinal(List<ModifierContext> modifierList) { boolean isFinal = false; if (modifierList != null) { for (ModifierContext modifier : modifierList) { if (modifier.getText().equals("final")) { isFinal = true; } } } return isFinal; } protected boolean determineIsStatic(List<JavaParser.ModifierContext> modifierList) { boolean isStatic = false; if (modifierList != null) { for (ModifierContext modifier : modifierList) { if (modifier.getText().equals("static")) { isStatic = true; } } } return isStatic; } protected void dispatchAnnotationsOfMember(List<ModifierContext> modifierList, String belongsToClass) { if (modifierList != null) { //int size = modifierList.size(); for (ModifierContext modifier : modifierList) { if ((modifier.classOrInterfaceModifier() != null) && (modifier.classOrInterfaceModifier().annotation() != null)) { new AnnotationAnalyser(modifier.classOrInterfaceModifier().annotation(), belongsToClass); } } } } /** Transforms the output of a list of Identifiers to a String. E.g. needed to transform TypeType.Identifier(). * * @param List<TerminalNode> identifierList * @return String */ protected String transformIdentifierToString(List<TerminalNode> identifierList) { String returnValue = ""; int sequence = 1; for(TerminalNode identifier : identifierList){ if (sequence == 1) { returnValue += identifier.getText(); } else { returnValue += "." + identifier.getText(); } sequence ++; } return returnValue; } protected String determineTypeOfTypeType(TypeTypeContext typeType, String belongsToClass) { String returnType = ""; if (typeType != null) { if (typeType.primitiveType() != null) { returnType = typeType.getText(); } else if (typeType.classOrInterfaceType() != null) { returnType = transformIdentifierToString(typeType.classOrInterfaceType().Identifier()); if (typeType.classOrInterfaceType().typeArguments() != null) { // Check if the contains generic type parameters. analyseTypeArguments(belongsToClass, typeType.classOrInterfaceType().typeArguments()); } } } return returnType; } // Detects generic type parameters recursively. Also in complex types such as: HashMap<ProfileDAO, ArrayList<FriendsDAO>>> protected void analyseTypeArguments(String belongsToClass, List<TypeArgumentsContext> typeArgumentsList) { for (TypeArgumentsContext typeArguments : typeArgumentsList) { for (TypeArgumentContext typeArgument : typeArguments.typeArgument()) { if (typeArgument.typeType() != null) { String parameterTypeOfGeneric = determineTypeOfTypeType(typeArgument.typeType(), belongsToClass); int currentLineNumber = typeArgument.typeType().start.getLine(); modelService.createTypeParameter(belongsToClass, currentLineNumber, parameterTypeOfGeneric); } } } } }