From 32b2bcab049948cd06ac6f178c80eba846293f76 Mon Sep 17 00:00:00 2001 From: CodeWithNab Date: Fri, 5 Apr 2024 10:46:26 +0530 Subject: [PATCH 1/3] check code quality of java file --- build.gradle | 6 + checkstyle-temp.xml | 24 + checkstyle.xml | 4 +- package-lock.json | 417 ++++++++++++------ package.json | 6 +- .../java/in/upcode/cat/domain/Submission.java | 11 + .../cat/service/CustomAuditListener.java | 53 +++ .../upcode/cat/service/SubmissionService.java | 51 +++ .../cat/service/SubmissionSubmitService.java | 77 ++++ .../upcode/cat/service/dto/SubmissionDTO.java | 11 + .../cat/web/rest/SubmissionResource.java | 23 + .../cat/web/rest/SubmissionResourceIT.java | 5 + 12 files changed, 560 insertions(+), 128 deletions(-) create mode 100644 checkstyle-temp.xml create mode 100644 src/main/java/in/upcode/cat/service/CustomAuditListener.java create mode 100644 src/main/java/in/upcode/cat/service/SubmissionSubmitService.java diff --git a/build.gradle b/build.gradle index a65561d..65c172a 100644 --- a/build.gradle +++ b/build.gradle @@ -204,6 +204,8 @@ dependencies { implementation "org.springframework.boot:spring-boot-starter-security" implementation "org.springframework.boot:spring-boot-starter-thymeleaf" implementation "org.springframework.boot:spring-boot-starter-web" + implementation 'com.puppycrawl.tools:checkstyle:10.14.1' + implementation 'com.google.guava:guava:30.1-jre' testImplementation "org.springframework.boot:spring-boot-starter-test" testImplementation "org.springframework.boot:spring-boot-test" testImplementation "org.springframework.security:spring-security-test" @@ -221,6 +223,10 @@ dependencies { // jhipster-needle-gradle-dependency - JHipster will add additional dependencies here } +configurations { + all*.exclude group: 'com.google.guava', module: 'guava' +} + if (project.hasProperty("gae")) { task createPom { def basePath = 'build/resources/main/META-INF/maven' diff --git a/checkstyle-temp.xml b/checkstyle-temp.xml new file mode 100644 index 0000000..71c23d1 --- /dev/null +++ b/checkstyle-temp.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + diff --git a/checkstyle.xml b/checkstyle.xml index 4c6a041..bc71af9 100644 --- a/checkstyle.xml +++ b/checkstyle.xml @@ -8,8 +8,8 @@ - - + + - + diff --git a/src/main/java/in/upcode/cat/service/SubmissionService.java b/src/main/java/in/upcode/cat/service/SubmissionService.java index fa9d2ae..a88b91a 100644 --- a/src/main/java/in/upcode/cat/service/SubmissionService.java +++ b/src/main/java/in/upcode/cat/service/SubmissionService.java @@ -13,8 +13,12 @@ import java.io.FileWriter; import java.io.IOException; import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.List; import java.util.Optional; +import org.kohsuke.github.GHContent; +import org.kohsuke.github.GHRepository; +import org.kohsuke.github.GitHub; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.domain.Page; @@ -82,14 +86,54 @@ public SubmissionDTO saveSubmit(SubmissionDTO submissionDTO) return submissionMapper.toDto(submission); } - private static File createTempFile(String content) throws IOException { - File tempFile = File.createTempFile("tempJavaFile", ".java"); + /** + * Save a submission. + * + * @param submissionDTO the entity to save. + * @return the persisted entity. + */ + public SubmissionDTO checkQuality(SubmissionDTO submissionDTO) throws Exception { + log.debug("Request to save Submission afet code Quality check : {}", submissionDTO); + + final String githubUrl = submissionDTO.getGithubUrl(); + + //connect to github + GitHub gitHub = GitHub.connectAnonymously(); + + final String[] parts = SubmissionSubmitService.extractUsernameAndRepo(githubUrl); + + //get the public repo + GHRepository repo = gitHub.getRepository(parts[0] + "/" + parts[1]); - try (FileWriter writer = new FileWriter(tempFile)) { - writer.write(content); + // List all files in the repository + List contents = repo.getDirectoryContent(""); + + final List results = new ArrayList<>(); // Initialize an empty list to hold the results + + // Perform Checkstyle analysis for each file + for (GHContent content : contents) { + if (!content.isDirectory() && content.getName().endsWith(".java")) { + final String fileName = content.getName(); + final String fileContent = content.getContent(); + + log.debug("List of Files {}", fileName); + + // Perform Checkstyle analysis for the file + final String report = SubmissionSubmitService.analyzeJavaFile(fileName, fileContent); + + // Append the result to the list + results.add(fileName + ": " + report); + + // Print quality report + log.info("Quality Report for: {}", fileName); + log.info(results.toString()); + } + submissionDTO.setResults(results.toString()); } - return tempFile; + Submission submission = submissionMapper.toEntity(submissionDTO); + submission = submissionRepository.save(submission); + return submissionMapper.toDto(submission); } /** diff --git a/src/main/java/in/upcode/cat/service/SubmissionSubmitService.java b/src/main/java/in/upcode/cat/service/SubmissionSubmitService.java index e865ce3..d20d701 100644 --- a/src/main/java/in/upcode/cat/service/SubmissionSubmitService.java +++ b/src/main/java/in/upcode/cat/service/SubmissionSubmitService.java @@ -2,21 +2,26 @@ import com.puppycrawl.tools.checkstyle.Checker; import com.puppycrawl.tools.checkstyle.ConfigurationLoader; +import com.puppycrawl.tools.checkstyle.DefaultLogger; +import com.puppycrawl.tools.checkstyle.LocalizedMessage; import com.puppycrawl.tools.checkstyle.api.CheckstyleException; import com.puppycrawl.tools.checkstyle.api.Configuration; import java.io.*; +import java.net.HttpURLConnection; import java.net.URI; import java.net.URISyntaxException; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; +import java.nio.charset.StandardCharsets; import java.util.List; +import org.apache.commons.compress.utils.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class SubmissionSubmitService { - private final Logger log = LoggerFactory.getLogger(SubmissionSubmitService.class); + public static final Logger log = LoggerFactory.getLogger(SubmissionSubmitService.class); public static String getRawContent(String rawUrl) throws URISyntaxException, IOException, InterruptedException { HttpRequest request = HttpRequest.newBuilder().uri(new URI(rawUrl)).GET().build(); @@ -24,7 +29,7 @@ public static String getRawContent(String rawUrl) throws URISyntaxException, IOE HttpClient client = HttpClient.newHttpClient(); HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString()); - if (response.statusCode() == 200) { + if (response.statusCode() == HttpURLConnection.HTTP_OK) { return response.body(); } else { throw new IOException("Failed to fetch raw content. Status code: " + response.statusCode()); @@ -32,8 +37,6 @@ public static String getRawContent(String rawUrl) throws URISyntaxException, IOE } public static String codeCheck(String javaCode) throws CheckstyleException, IOException { - String result; - // Create a Checkstyle Checker Checker checker = new Checker(); // Load Checkstyle configuration @@ -42,7 +45,7 @@ public static String codeCheck(String javaCode) throws CheckstyleException, IOEx checker.configure(config); // Write file contents to a temporary file - File tempFile = createTempFile(javaCode); + File tempFile = createTempFile("temp", javaCode); List fileList = List.of(tempFile); @@ -56,17 +59,11 @@ public static String codeCheck(String javaCode) throws CheckstyleException, IOEx // Close the Checkstyle checker checker.destroy(); - if (auditListener.getViolationsAsString().length() == 0) { - result = "no violations"; - } else { - result = auditListener.getViolationsAsString(); - } - - return result; + return (auditListener.getViolationsAsString().isEmpty()) ? "no violations" : auditListener.getViolationsAsString(); } - private static File createTempFile(String content) throws IOException { - File tempFile = File.createTempFile("tempJavaFile", ".java"); + private static File createTempFile(String fileName, String content) throws IOException { + final File tempFile = File.createTempFile(fileName, ".java"); try (FileWriter writer = new FileWriter(tempFile)) { writer.write(content); @@ -74,4 +71,49 @@ private static File createTempFile(String content) throws IOException { return tempFile; } + + public static String[] extractUsernameAndRepo(String url) { + // Remove any trailing slash from the URL + url = url.replaceAll("/$", ""); + + // Split the URL by "/" to get individual parts + String[] parts = url.split("/"); + + // Extract the username and repository name + String username = parts[parts.length - 2]; // Second-to-last part + String repoName = parts[parts.length - 1]; // Last part + + return new String[] { username, repoName }; + } + + public static String analyzeJavaFile(String fileName, String fileContent) throws Exception { + log.debug("analysing files..."); + // Create Checker instance + Checker checker = new Checker(); + + // Load Checkstyle configuration + Configuration config = ConfigurationLoader.loadConfiguration("checkstyle-temp.xml", null); + checker.setModuleClassLoader(Thread.currentThread().getContextClassLoader()); + checker.configure(config); + + // Configure Checker + checker.configure(config); + + // Create custom AuditListener to capture Checkstyle results + CustomAuditListener auditListener = new CustomAuditListener(); + checker.addListener(auditListener); + + // Write file contents to a temporary file + File tempFile = createTempFile(fileName, fileContent); + + List fileList = List.of(tempFile); + + checker.process(fileList); + + // Close checker + checker.destroy(); + + // Generate quality report + return (auditListener.getViolationsAsString().isEmpty()) ? "no violations" : auditListener.getViolationsAsString(); + } } diff --git a/src/main/java/in/upcode/cat/web/rest/SubmissionResource.java b/src/main/java/in/upcode/cat/web/rest/SubmissionResource.java index 6cbe738..f998c47 100644 --- a/src/main/java/in/upcode/cat/web/rest/SubmissionResource.java +++ b/src/main/java/in/upcode/cat/web/rest/SubmissionResource.java @@ -90,6 +90,26 @@ public ResponseEntity createSubmissionSubmit(@Valid @RequestBody .body(result); } + /** + * {@code POST /submissions/submit} : Create a new submission. + * + * @param submissionDTO the submissionDTO to create. + * @return the {@link ResponseEntity} with status {@code 201 (Created)} and with body the new submissionDTO, or with status {@code 400 (Bad Request)} if the submission has already an ID. + * @throws URISyntaxException if the Location URI syntax is incorrect. + */ + @PostMapping("/check") + public ResponseEntity createSubmissionGithubRepo(@Valid @RequestBody SubmissionDTO submissionDTO) throws Exception { + log.debug("REST request to check Quality Submission : {}", submissionDTO); + if (submissionDTO.getId() != null) { + throw new BadRequestAlertException("A new submission cannot already have an ID", ENTITY_NAME, "idexists"); + } + SubmissionDTO result = submissionService.checkQuality(submissionDTO); + return ResponseEntity + .created(new URI("/api/submissions/" + result.getId())) + .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId())) + .body(result); + } + /** * {@code PUT /submissions/:id} : Updates an existing submission. * diff --git a/src/test/java/in/upcode/cat/web/rest/SubmissionResourceIT.java b/src/test/java/in/upcode/cat/web/rest/SubmissionResourceIT.java index d2a497d..e9842c1 100644 --- a/src/test/java/in/upcode/cat/web/rest/SubmissionResourceIT.java +++ b/src/test/java/in/upcode/cat/web/rest/SubmissionResourceIT.java @@ -105,11 +105,6 @@ public void initTest() { submission = createEntity(); } - @Test - void example() { - System.out.println("test"); - } - @Test void createSubmission() throws Exception { int databaseSizeBeforeCreate = submissionRepository.findAll().size(); From 18a81d7bf29a61c95ed245a08d0dcd38e1849851 Mon Sep 17 00:00:00 2001 From: fathimanabeela Date: Tue, 9 Apr 2024 11:17:14 +0530 Subject: [PATCH 3/3] modify variable to final,change classname --- ...ervice.java => SubmissionCodeQualityCheck.java} | 12 ++++-------- .../in/upcode/cat/service/SubmissionService.java | 14 +++++++++----- .../in/upcode/cat/web/rest/SubmissionResource.java | 4 ++-- 3 files changed, 15 insertions(+), 15 deletions(-) rename src/main/java/in/upcode/cat/service/{SubmissionSubmitService.java => SubmissionCodeQualityCheck.java} (89%) diff --git a/src/main/java/in/upcode/cat/service/SubmissionSubmitService.java b/src/main/java/in/upcode/cat/service/SubmissionCodeQualityCheck.java similarity index 89% rename from src/main/java/in/upcode/cat/service/SubmissionSubmitService.java rename to src/main/java/in/upcode/cat/service/SubmissionCodeQualityCheck.java index d20d701..9905d14 100644 --- a/src/main/java/in/upcode/cat/service/SubmissionSubmitService.java +++ b/src/main/java/in/upcode/cat/service/SubmissionCodeQualityCheck.java @@ -2,8 +2,6 @@ import com.puppycrawl.tools.checkstyle.Checker; import com.puppycrawl.tools.checkstyle.ConfigurationLoader; -import com.puppycrawl.tools.checkstyle.DefaultLogger; -import com.puppycrawl.tools.checkstyle.LocalizedMessage; import com.puppycrawl.tools.checkstyle.api.CheckstyleException; import com.puppycrawl.tools.checkstyle.api.Configuration; import java.io.*; @@ -13,15 +11,13 @@ import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; -import java.nio.charset.StandardCharsets; import java.util.List; -import org.apache.commons.compress.utils.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class SubmissionSubmitService { +public class SubmissionCodeQualityCheck { - public static final Logger log = LoggerFactory.getLogger(SubmissionSubmitService.class); + private static final Logger log = LoggerFactory.getLogger(SubmissionCodeQualityCheck.class); public static String getRawContent(String rawUrl) throws URISyntaxException, IOException, InterruptedException { HttpRequest request = HttpRequest.newBuilder().uri(new URI(rawUrl)).GET().build(); @@ -36,7 +32,7 @@ public static String getRawContent(String rawUrl) throws URISyntaxException, IOE } } - public static String codeCheck(String javaCode) throws CheckstyleException, IOException { + public static String codeCheck(String fileName, String javaCode) throws CheckstyleException, IOException { // Create a Checkstyle Checker Checker checker = new Checker(); // Load Checkstyle configuration @@ -45,7 +41,7 @@ public static String codeCheck(String javaCode) throws CheckstyleException, IOEx checker.configure(config); // Write file contents to a temporary file - File tempFile = createTempFile("temp", javaCode); + File tempFile = createTempFile(fileName, javaCode); List fileList = List.of(tempFile); diff --git a/src/main/java/in/upcode/cat/service/SubmissionService.java b/src/main/java/in/upcode/cat/service/SubmissionService.java index a88b91a..2e8414e 100644 --- a/src/main/java/in/upcode/cat/service/SubmissionService.java +++ b/src/main/java/in/upcode/cat/service/SubmissionService.java @@ -73,13 +73,17 @@ public SubmissionDTO saveSubmit(SubmissionDTO submissionDTO) // Replace "github.com" with "raw.githubusercontent.com" rawUrl = rawUrl.replace("github.com", "raw.githubusercontent.com"); - String rawContent = SubmissionSubmitService.getRawContent(rawUrl); + String rawContent = SubmissionCodeQualityCheck.getRawContent(rawUrl); + + final String[] parts = rawContent.split("/"); + + final String fileName = parts[parts.length - 1]; log.debug("File contents : {}", rawContent); // Display the result using logger.debug - log.debug("####Checkstyle Result: {}", SubmissionSubmitService.codeCheck(rawContent)); - submissionDTO.setResults(SubmissionSubmitService.codeCheck(rawContent)); + log.debug("####Checkstyle Result: {}", SubmissionCodeQualityCheck.codeCheck(fileName, rawContent)); + submissionDTO.setResults(SubmissionCodeQualityCheck.codeCheck(fileName, rawContent)); Submission submission = submissionMapper.toEntity(submissionDTO); submission = submissionRepository.save(submission); @@ -100,7 +104,7 @@ public SubmissionDTO checkQuality(SubmissionDTO submissionDTO) throws Exception //connect to github GitHub gitHub = GitHub.connectAnonymously(); - final String[] parts = SubmissionSubmitService.extractUsernameAndRepo(githubUrl); + final String[] parts = SubmissionCodeQualityCheck.extractUsernameAndRepo(githubUrl); //get the public repo GHRepository repo = gitHub.getRepository(parts[0] + "/" + parts[1]); @@ -119,7 +123,7 @@ public SubmissionDTO checkQuality(SubmissionDTO submissionDTO) throws Exception log.debug("List of Files {}", fileName); // Perform Checkstyle analysis for the file - final String report = SubmissionSubmitService.analyzeJavaFile(fileName, fileContent); + final String report = SubmissionCodeQualityCheck.analyzeJavaFile(fileName, fileContent); // Append the result to the list results.add(fileName + ": " + report); diff --git a/src/main/java/in/upcode/cat/web/rest/SubmissionResource.java b/src/main/java/in/upcode/cat/web/rest/SubmissionResource.java index f998c47..c870229 100644 --- a/src/main/java/in/upcode/cat/web/rest/SubmissionResource.java +++ b/src/main/java/in/upcode/cat/web/rest/SubmissionResource.java @@ -83,7 +83,7 @@ public ResponseEntity createSubmissionSubmit(@Valid @RequestBody if (submissionDTO.getId() != null) { throw new BadRequestAlertException("A new submission cannot already have an ID", ENTITY_NAME, "idexists"); } - SubmissionDTO result = submissionService.saveSubmit(submissionDTO); + final SubmissionDTO result = submissionService.saveSubmit(submissionDTO); return ResponseEntity .created(new URI("/api/submissions/" + result.getId())) .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId())) @@ -103,7 +103,7 @@ public ResponseEntity createSubmissionGithubRepo(@Valid @RequestB if (submissionDTO.getId() != null) { throw new BadRequestAlertException("A new submission cannot already have an ID", ENTITY_NAME, "idexists"); } - SubmissionDTO result = submissionService.checkQuality(submissionDTO); + final SubmissionDTO result = submissionService.checkQuality(submissionDTO); return ResponseEntity .created(new URI("/api/submissions/" + result.getId())) .headers(HeaderUtil.createEntityCreationAlert(applicationName, true, ENTITY_NAME, result.getId()))