From 9fcc14ae6f15429b2db28a2c6fc3e3589e679ade Mon Sep 17 00:00:00 2001 From: Anton Romanov Date: Mon, 12 Apr 2021 12:12:24 +0400 Subject: [PATCH] #20 -- Get business logic classes --- .../api/StructuralUnitIdentifier.java | 14 ++++++--- .../controller/StructuralUnitController.java | 11 +++++-- .../heuristic/model/BusinessLogicUnit.java | 15 ++++++++++ .../heuristic/service/JavaIdentifier.java | 29 +++++++++++++------ .../service/StructuralUnitService.java | 17 +++++++++-- 5 files changed, 69 insertions(+), 17 deletions(-) create mode 100644 src/main/java/ru/ulstu/extractor/heuristic/model/BusinessLogicUnit.java diff --git a/src/main/java/ru/ulstu/extractor/heuristic/api/StructuralUnitIdentifier.java b/src/main/java/ru/ulstu/extractor/heuristic/api/StructuralUnitIdentifier.java index 5956542..9ea3355 100644 --- a/src/main/java/ru/ulstu/extractor/heuristic/api/StructuralUnitIdentifier.java +++ b/src/main/java/ru/ulstu/extractor/heuristic/api/StructuralUnitIdentifier.java @@ -7,7 +7,8 @@ package ru.ulstu.extractor.heuristic.api; import ru.ulstu.extractor.heuristic.component.BuildTool; import ru.ulstu.extractor.heuristic.component.ProgrammingLanguage; -import ru.ulstu.extractor.heuristic.model.StructuralUnit; +import ru.ulstu.extractor.heuristic.model.BusinessLogicUnit; +import ru.ulstu.extractor.heuristic.model.EntityUnit; import ru.ulstu.extractor.heuristic.service.DetectorService; import ru.ulstu.extractor.heuristic.service.ProgrammingLanguageService; import ru.ulstu.extractor.util.StringUtils; @@ -24,11 +25,16 @@ import static ru.ulstu.extractor.heuristic.service.DetectorService.LangDetectScr import static ru.ulstu.extractor.heuristic.service.DetectorService.LangDetectScrupulousness.LOW; public abstract class StructuralUnitIdentifier { - public List getEntityClasses(String projectPath, List projectFiles, List rootProjectFiles) { + public List getEntityClasses(String projectPath, List projectFiles, List rootProjectFiles) { String subDirectory = getSourceDirectory(rootProjectFiles); return getEntityClasses(projectPath, subDirectory, projectFiles); } + public List getBusinessLogicClasses(String projectPath, List projectFiles, List rootProjectFiles) { + String subDirectory = getSourceDirectory(rootProjectFiles); + return getBusinessLogicClasses(projectPath, subDirectory, projectFiles); + } + public abstract boolean canAppliedToCode(String sourceCode); public abstract boolean canAppliedToFile(File projectFile); @@ -41,13 +47,13 @@ public abstract class StructuralUnitIdentifier { protected abstract boolean isBusinessLogicClass(File file); - public abstract List getBusinessLogicClasses(); + public abstract List getBusinessLogicClasses(String projectPath, String subDirectory, List projectFiles); public abstract boolean isMultiModuleProject(); public abstract Optional getBuildTool(List rootDirectoryFiles); - protected abstract List getEntityClasses(String projectPath, String subDirectory, List projectFiles); + protected abstract List getEntityClasses(String projectPath, String subDirectory, List projectFiles); protected abstract String getSourceDirectory(List rootProjectFiles); diff --git a/src/main/java/ru/ulstu/extractor/heuristic/controller/StructuralUnitController.java b/src/main/java/ru/ulstu/extractor/heuristic/controller/StructuralUnitController.java index ff9b7fa..7024d56 100644 --- a/src/main/java/ru/ulstu/extractor/heuristic/controller/StructuralUnitController.java +++ b/src/main/java/ru/ulstu/extractor/heuristic/controller/StructuralUnitController.java @@ -8,7 +8,8 @@ package ru.ulstu.extractor.heuristic.controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import ru.ulstu.extractor.heuristic.model.StructuralUnit; +import ru.ulstu.extractor.heuristic.model.BusinessLogicUnit; +import ru.ulstu.extractor.heuristic.model.EntityUnit; import ru.ulstu.extractor.heuristic.service.StructuralUnitService; import ru.ulstu.extractor.service.GitRepositoryService; @@ -29,8 +30,14 @@ public class StructuralUnitController { } @GetMapping("get-entities") - public List getEntities(String repositoryUrl) throws IOException { + public List getEntities(String repositoryUrl) throws IOException { File rootPath = gitRepositoryService.getProjectDirectoryFile(repositoryUrl); return structuralUnitService.getEntities(rootPath); } + + @GetMapping("get-business-logic") + public List getBusinessLogic(String repositoryUrl) throws IOException { + File rootPath = gitRepositoryService.getProjectDirectoryFile(repositoryUrl); + return structuralUnitService.getBusinessLogic(rootPath); + } } diff --git a/src/main/java/ru/ulstu/extractor/heuristic/model/BusinessLogicUnit.java b/src/main/java/ru/ulstu/extractor/heuristic/model/BusinessLogicUnit.java new file mode 100644 index 0000000..9d8e132 --- /dev/null +++ b/src/main/java/ru/ulstu/extractor/heuristic/model/BusinessLogicUnit.java @@ -0,0 +1,15 @@ +/* + * Copyright (C) 2021 Anton Romanov - All Rights Reserved + * You may use, distribute and modify this code, please write to: romanov73@gmail.com. + */ + +package ru.ulstu.extractor.heuristic.model; + +import java.io.File; + +public class BusinessLogicUnit extends StructuralUnit { + + public BusinessLogicUnit(String projectPath, File file) { + super(projectPath, file); + } +} diff --git a/src/main/java/ru/ulstu/extractor/heuristic/service/JavaIdentifier.java b/src/main/java/ru/ulstu/extractor/heuristic/service/JavaIdentifier.java index 438ed33..ef2a70a 100644 --- a/src/main/java/ru/ulstu/extractor/heuristic/service/JavaIdentifier.java +++ b/src/main/java/ru/ulstu/extractor/heuristic/service/JavaIdentifier.java @@ -13,8 +13,8 @@ import ru.ulstu.extractor.heuristic.api.StructuralUnitIdentifier; import ru.ulstu.extractor.heuristic.component.BuildTool; import ru.ulstu.extractor.heuristic.component.JavaProgrammingLanguage; import ru.ulstu.extractor.heuristic.component.ProgrammingLanguage; +import ru.ulstu.extractor.heuristic.model.BusinessLogicUnit; import ru.ulstu.extractor.heuristic.model.EntityUnit; -import ru.ulstu.extractor.heuristic.model.StructuralUnit; import ru.ulstu.extractor.util.StringUtils; import java.io.File; @@ -29,6 +29,7 @@ import static ru.ulstu.extractor.heuristic.service.DetectorService.LangDetectScr @Service public class JavaIdentifier extends StructuralUnitIdentifier { private static final String ENTITY_ANNOTATION = "@Entity"; + private static final String SERVICE_ANNOTATION = "@Service"; private final DetectorService detectorService; private final BuildToolService buildToolService; private final ProgrammingLanguageService programmingLanguageService; @@ -56,7 +57,7 @@ public class JavaIdentifier extends StructuralUnitIdentifier { } @Override - public List getEntityClasses(String projectPath, String subDirectory, List projectFiles) { + public List getEntityClasses(String projectPath, String subDirectory, List projectFiles) { return projectFiles.stream() .filter(file -> StringUtils.fileInSubdirectory(file.getPath(), projectPath, subDirectory)) .filter(this::isEntityClass) @@ -64,15 +65,14 @@ public class JavaIdentifier extends StructuralUnitIdentifier { .collect(Collectors.toList()); } - protected Optional getMainProgrammingLanguage(String sourceCode) { - return sourceCodeContainsClass(sourceCode) - ? Optional.of(getProgrammingLanguage()) - : Optional.empty(); - } @Override - public List getBusinessLogicClasses() { - return null; + public List getBusinessLogicClasses(String projectPath, String subDirectory, List projectFiles) { + return projectFiles.stream() + .filter(file -> StringUtils.fileInSubdirectory(file.getPath(), projectPath, subDirectory)) + .filter(this::isBusinessLogicClass) + .map(file -> new BusinessLogicUnit(projectPath, file)) + .collect(Collectors.toList()); } @Override @@ -85,6 +85,12 @@ public class JavaIdentifier extends StructuralUnitIdentifier { return buildToolService.getProjectBuildTool(rootDirectoryFiles); } + protected Optional getMainProgrammingLanguage(String sourceCode) { + return sourceCodeContainsClass(sourceCode) + ? Optional.of(getProgrammingLanguage()) + : Optional.empty(); + } + @Override protected DetectorService getDetectorService() { return detectorService; @@ -152,6 +158,11 @@ public class JavaIdentifier extends StructuralUnitIdentifier { @Override protected boolean isBusinessLogicClass(File file) { + try { + return file.getName().endsWith("java") && classContainsAnnotation(file, SERVICE_ANNOTATION); + } catch (Exception ex) { + ex.printStackTrace(); + } return false; } } diff --git a/src/main/java/ru/ulstu/extractor/heuristic/service/StructuralUnitService.java b/src/main/java/ru/ulstu/extractor/heuristic/service/StructuralUnitService.java index c7bdfcc..83dc150 100644 --- a/src/main/java/ru/ulstu/extractor/heuristic/service/StructuralUnitService.java +++ b/src/main/java/ru/ulstu/extractor/heuristic/service/StructuralUnitService.java @@ -7,7 +7,8 @@ package ru.ulstu.extractor.heuristic.service; import org.springframework.stereotype.Service; import ru.ulstu.extractor.heuristic.api.StructuralUnitIdentifier; -import ru.ulstu.extractor.heuristic.model.StructuralUnit; +import ru.ulstu.extractor.heuristic.model.BusinessLogicUnit; +import ru.ulstu.extractor.heuristic.model.EntityUnit; import java.io.File; import java.io.IOException; @@ -26,7 +27,7 @@ public class StructuralUnitService { this.structuralUnitIdentifiers = structuralUnitIdentifiers; } - public List getEntities(File rootPath) throws IOException { + public List getEntities(File rootPath) throws IOException { List projectFiles = directoryService.getFilesRecursively(rootPath); List rootProjectFiles = directoryService.getDirectoryFiles(rootPath.toPath()); return getStructuralUnitIdentifier( @@ -38,6 +39,18 @@ public class StructuralUnitService { .getEntityClasses(rootPath.getPath(), projectFiles, rootProjectFiles); } + public List getBusinessLogic(File rootPath) throws IOException { + List projectFiles = directoryService.getFilesRecursively(rootPath); + List rootProjectFiles = directoryService.getDirectoryFiles(rootPath.toPath()); + return getStructuralUnitIdentifier( + structuralUnitIdentifier -> structuralUnitIdentifier.canAppliedToProject( + rootPath.getPath(), + projectFiles, + rootProjectFiles)) + .orElseThrow(() -> new RuntimeException("Identifier not found")) + .getBusinessLogicClasses(rootPath.getPath(), projectFiles, rootProjectFiles); + } + public boolean containsEntity(File projectFile) { return getStructuralUnitIdentifier( structuralUnitIdentifier -> structuralUnitIdentifier.canAppliedToFile(projectFile))