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