From bfb5262fca61e36211fc42c2291b1ea4e2965e6c Mon Sep 17 00:00:00 2001 From: bushkovsky <62966446+bushkovsky@users.noreply.github.com> Date: Mon, 13 May 2024 05:35:38 +0300 Subject: [PATCH 1/2] task --- solution/pom.xml | 16 +++++++ .../src/main/java/org/bushkovsky/Main.java | 19 ++++++++ .../java/org/bushkovsky/Reader/Reader.java | 33 ++++++++++++++ .../main/java/org/bushkovsky/ResultMaker.java | 45 +++++++++++++++++++ .../org/bushkovsky/parsers/ParserCommits.java | 36 +++++++++++++++ .../main/java/org/bushkovsky/paths/Paths.java | 14 ++++++ .../java/org/bushkovsky/services/Service.java | 31 +++++++++++++ .../java/org/bushkovsky/writers/Writer.java | 27 +++++++++++ solution/src/main/resources/commits.txt | 20 +++++++++ solution/src/main/resources/result.txt | 3 ++ 10 files changed, 244 insertions(+) create mode 100644 solution/pom.xml create mode 100644 solution/src/main/java/org/bushkovsky/Main.java create mode 100644 solution/src/main/java/org/bushkovsky/Reader/Reader.java create mode 100644 solution/src/main/java/org/bushkovsky/ResultMaker.java create mode 100644 solution/src/main/java/org/bushkovsky/parsers/ParserCommits.java create mode 100644 solution/src/main/java/org/bushkovsky/paths/Paths.java create mode 100644 solution/src/main/java/org/bushkovsky/services/Service.java create mode 100644 solution/src/main/java/org/bushkovsky/writers/Writer.java create mode 100644 solution/src/main/resources/commits.txt create mode 100644 solution/src/main/resources/result.txt diff --git a/solution/pom.xml b/solution/pom.xml new file mode 100644 index 0000000..aa94156 --- /dev/null +++ b/solution/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + + org.bushkovsky + solution + 1.0-SNAPSHOT + + 21 + 21 + + + + \ No newline at end of file diff --git a/solution/src/main/java/org/bushkovsky/Main.java b/solution/src/main/java/org/bushkovsky/Main.java new file mode 100644 index 0000000..1db7185 --- /dev/null +++ b/solution/src/main/java/org/bushkovsky/Main.java @@ -0,0 +1,19 @@ +package org.bushkovsky; + +import org.bushkovsky.Reader.Reader; +import org.bushkovsky.services.Service; +import org.bushkovsky.writers.Writer; + + +public class Main { + + public static void main(String[] args) { + Service service = new Service(); + Reader reader = new Reader(); + ResultMaker maker = new ResultMaker(); + Writer writer = new Writer(); + + reader.read(args[0], service); + writer.write(args[0], maker.getRank(service)); + } +} \ No newline at end of file diff --git a/solution/src/main/java/org/bushkovsky/Reader/Reader.java b/solution/src/main/java/org/bushkovsky/Reader/Reader.java new file mode 100644 index 0000000..7c5ee79 --- /dev/null +++ b/solution/src/main/java/org/bushkovsky/Reader/Reader.java @@ -0,0 +1,33 @@ +package org.bushkovsky.Reader; + +import org.bushkovsky.paths.Paths; +import org.bushkovsky.services.Service; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.text.ParseException; + +public class Reader { + private final Paths localPaths = new Paths(); + public void read(String path, Service service) { + + File file = new File(path + localPaths.getCommits()); + try { + FileReader fileReader = new FileReader(file); + BufferedReader bufferedReader = new BufferedReader(fileReader); + String commit; + + while ((commit = bufferedReader.readLine()) != null) { + service.addLine(commit); + } + + bufferedReader.close(); + } catch (IOException e) { + throw new RuntimeException(e.getMessage()); + } catch (ParseException e) { + System.out.println(e.getMessage()); + } + } +} diff --git a/solution/src/main/java/org/bushkovsky/ResultMaker.java b/solution/src/main/java/org/bushkovsky/ResultMaker.java new file mode 100644 index 0000000..3c474f4 --- /dev/null +++ b/solution/src/main/java/org/bushkovsky/ResultMaker.java @@ -0,0 +1,45 @@ +package org.bushkovsky; + +import org.bushkovsky.services.Service; + +import java.util.HashMap; +import java.util.Map; + +public class ResultMaker { + Integer[] values; + + String[] names; + + public ResultMaker(){ + values = new Integer[]{0, 0, 0}; + names = new String[]{"", "", ""}; + } + + + public String getRank(Service service){ + String[] result = ranking(service); + return result[0] + "\n" + result[1] + "\n" + result[2]; + } + + private String[] ranking(Service service){ + HashMap contributorsRating = service.getContributorsRating(); + for (Map.Entry entry : contributorsRating.entrySet()) { + String key = entry.getKey(); + Integer value = entry.getValue(); + + for (int i = 0; i < 3; i++){ + if(maximum(value, values[i])){ + values[i] = value; + names[i] = key; + break; + } + } + + } + return names; + } + + public boolean maximum(int a, int b){ + return a > b; + } +} diff --git a/solution/src/main/java/org/bushkovsky/parsers/ParserCommits.java b/solution/src/main/java/org/bushkovsky/parsers/ParserCommits.java new file mode 100644 index 0000000..98937f3 --- /dev/null +++ b/solution/src/main/java/org/bushkovsky/parsers/ParserCommits.java @@ -0,0 +1,36 @@ +package org.bushkovsky.parsers; +import java.text.ParseException; +import java.util.HashMap; +import java.util.regex.Matcher; +public class ParserCommits { + private final String USERNAME_REGEX = "^[a-zA-Z][a-zA-Z0-9_]*$"; + private final String COMMIT_HASH_REGEX = "^[a-f0-9]{7}$"; + private final String DATE_TIME_REGEX = "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}$"; + public String parse(String line) throws ParseException { + String[] splitLine = line.split(" "); + if (checkLine(splitLine)) { + return splitLine[0]; + } + else { + throw new ParseException("Incorrect line " + splitLine[0] + " " + splitLine[1] + " " + splitLine[2] + " " + splitLine.length, 0); + } + } + + private boolean checkLine(String[] splitLine){ + return splitLine.length == 3 && checkName(splitLine[0]) && checkCommit(splitLine[1]) + && checkDate(splitLine[2]); + } + + + private boolean checkName(String name) { + return name.matches(USERNAME_REGEX); + } + + private boolean checkCommit(String commitHash) { + return commitHash.matches(COMMIT_HASH_REGEX); + } + + private boolean checkDate(String dateTime) { + return dateTime.matches(DATE_TIME_REGEX); + } +} diff --git a/solution/src/main/java/org/bushkovsky/paths/Paths.java b/solution/src/main/java/org/bushkovsky/paths/Paths.java new file mode 100644 index 0000000..d8bb604 --- /dev/null +++ b/solution/src/main/java/org/bushkovsky/paths/Paths.java @@ -0,0 +1,14 @@ +package org.bushkovsky.paths; + +public class Paths { + final String result = "/school2024-test-task4/solution/src/main/resources/result.txt"; + final String commits = "/school2024-test-task4/solution/src/main/resources/commits.txt"; + + public String getCommits() { + return commits; + } + + public String getResult() { + return result; + } +} diff --git a/solution/src/main/java/org/bushkovsky/services/Service.java b/solution/src/main/java/org/bushkovsky/services/Service.java new file mode 100644 index 0000000..fbe0fa7 --- /dev/null +++ b/solution/src/main/java/org/bushkovsky/services/Service.java @@ -0,0 +1,31 @@ +package org.bushkovsky.services; + +import org.bushkovsky.parsers.ParserCommits; + +import java.text.ParseException; +import java.util.HashMap; + +public class Service { + + ParserCommits parserCommits = new ParserCommits(); + private final HashMap contributorsRating = new HashMap(); + + public void addLine(String line) throws ParseException { + doCount(parserCommits.parse(line)); + } + + private void doCount(String name){ + if (contributorsRating.containsKey(name)) { + Integer num = contributorsRating.get(name); + num++; + contributorsRating.put(name, num); + } + else { + contributorsRating.put(name, 1); + } + } + + public HashMap getContributorsRating() { + return contributorsRating; + } +} diff --git a/solution/src/main/java/org/bushkovsky/writers/Writer.java b/solution/src/main/java/org/bushkovsky/writers/Writer.java new file mode 100644 index 0000000..58ed325 --- /dev/null +++ b/solution/src/main/java/org/bushkovsky/writers/Writer.java @@ -0,0 +1,27 @@ +package org.bushkovsky.writers; +import org.bushkovsky.paths.Paths; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; + +public class Writer { + Paths paths = new Paths(); + public void write(String path, String s){ + String filePath = path + paths.getResult(); + try { + writeToFile(filePath, s); + System.out.println("String was successfully wrote"); + } catch (IOException e) { + System.out.println("Error: " + e.getMessage()); + } + } + + public static void writeToFile(String filename, String s) throws IOException { + FileWriter fileWriter = new FileWriter(filename); + BufferedWriter bufferedWriter = new BufferedWriter(fileWriter); + bufferedWriter.write(s); + bufferedWriter.close(); + } +} diff --git a/solution/src/main/resources/commits.txt b/solution/src/main/resources/commits.txt new file mode 100644 index 0000000..6610596 --- /dev/null +++ b/solution/src/main/resources/commits.txt @@ -0,0 +1,20 @@ +CIvanova 3d5bf7a 2023-10-19T20:10:43 +AIvanov 35ca1a8 2023-11-05T09:21:17 +EAntonova 6e7d2b1 2023-11-09T15:38:30 +CIvanova 4fc2a81 2023-11-15T13:03:05 +BPetrov 81c8b99 2023-11-16T01:39:14 +BPetrov 97baf6d 2023-11-16T17:29:18 +CIvanova 8e9f47e 2023-11-17T09:05:56 +DStepanov 2a9b3d5 2023-11-17T15:58:06 +CIvanova 7a8942c 2023-11-17T21:42:27 +AIvanov 3eac6ba 2023-11-18T15:14:55 +CIvanova 4880672 2023-11-18T18:30:20 +BPetrov 9d6b82d 2023-11-18T22:09:57 +DStepanov 5d73c14 2023-11-19T11:16:10 +CIvanova 00e0136 2023-11-19T22:26:34 +AIvanov 1d35d96 2023-11-21T09:22:00 +BPetrov 2c99749 2023-11-21T18:54:01 +BPetrov 26a6d6b 2023-11-22T04:37:49 +DStepanov 50bb1fa 2023-11-22T10:05:42 +CIvanova 7a8942c 2023-11-22T15:17:19 +CIvanova 0637885 2023-11-23T00:51:45 diff --git a/solution/src/main/resources/result.txt b/solution/src/main/resources/result.txt new file mode 100644 index 0000000..76c3600 --- /dev/null +++ b/solution/src/main/resources/result.txt @@ -0,0 +1,3 @@ +CIvanova +BPetrov +DStepanov \ No newline at end of file From 336d92409f3d6405a2c99f083c7fcadf4e335bfc Mon Sep 17 00:00:00 2001 From: Ivan Bushkovsky <62966446+bushkovsky@users.noreply.github.com> Date: Mon, 13 May 2024 06:01:47 +0300 Subject: [PATCH 2/2] Update README.md --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a2bc0aa..d5e635b 100644 --- a/README.md +++ b/README.md @@ -23,7 +23,14 @@ CodeKiller777 Ручной ввод пути к файлу (через консоль, через правку переменной в коде и т.д.) недопустим. Необходимость любых ручных действий с файлами в процессе работы программы будут обнулять решение. ## Автор решения +Бушковский Иван Сергеевич ## Описание реализации - +Данный проект обрабатывает файл commit.txt и определяет топ-3 контрибьютера и записывает результат в result.txt +Класс Reader считывает данные из файла и передает их в Service, в котором проверяется строка на корректность с помощью ParseCommit и инкрементируется результат у соответствуюшего контрибьютера с помощью HashMap. +После с помощью ResultMaker определяются топ-3 контрибьютера с последующим выводом в result.txt с помощью Writer ## Инструкция по сборке и запуску решения +Надо сделать Build модуля solution (так внутри solution помимо папки src появится директория target с нужными для запуска .class файлами), после чего можно запустить следующим образом: +java -cp "ПУТЬ ДО РЕПОЗИТОРИЯ В ВАШЕЙ СИСТЕМЕ"/school2024-test-task4/solution/target/classes org.bushkovsky.Main "ПУТЬ ДО РЕПОЗИТОРИЯ В ВАШЕЙ СИСТЕМЕ" +Например: +java -cp /Users/ivanbuskovskij/IdeaProjects/school2024-test-task4/solution/target/classes org.bushkovsky.Main /Users/ivanbuskovskij/IdeaProjects