diff --git a/.gradle/6.5.1/executionHistory/executionHistory.lock b/.gradle/6.5.1/executionHistory/executionHistory.lock new file mode 100644 index 00000000..13ac90b9 Binary files /dev/null and b/.gradle/6.5.1/executionHistory/executionHistory.lock differ diff --git a/.gradle/6.5.1/fileChanges/last-build.bin b/.gradle/6.5.1/fileChanges/last-build.bin new file mode 100644 index 00000000..f76dd238 Binary files /dev/null and b/.gradle/6.5.1/fileChanges/last-build.bin differ diff --git a/.gradle/6.5.1/fileHashes/fileHashes.lock b/.gradle/6.5.1/fileHashes/fileHashes.lock new file mode 100644 index 00000000..13650949 Binary files /dev/null and b/.gradle/6.5.1/fileHashes/fileHashes.lock differ diff --git a/.gradle/6.5.1/gc.properties b/.gradle/6.5.1/gc.properties new file mode 100644 index 00000000..e69de29b diff --git a/.gradle/buildOutputCleanup/buildOutputCleanup.lock b/.gradle/buildOutputCleanup/buildOutputCleanup.lock new file mode 100644 index 00000000..96fff53f Binary files /dev/null and b/.gradle/buildOutputCleanup/buildOutputCleanup.lock differ diff --git a/.gradle/buildOutputCleanup/cache.properties b/.gradle/buildOutputCleanup/cache.properties new file mode 100644 index 00000000..867484f6 --- /dev/null +++ b/.gradle/buildOutputCleanup/cache.properties @@ -0,0 +1,2 @@ +#Mon Dec 21 19:42:28 MSK 2020 +gradle.version=6.5.1 diff --git a/.gradle/checksums/checksums.lock b/.gradle/checksums/checksums.lock new file mode 100644 index 00000000..1e873cd4 Binary files /dev/null and b/.gradle/checksums/checksums.lock differ diff --git a/.gradle/vcs-1/gc.properties b/.gradle/vcs-1/gc.properties new file mode 100644 index 00000000..e69de29b diff --git a/java-data-handling-template.iml b/java-data-handling-template.iml new file mode 100644 index 00000000..5e9ffdc5 --- /dev/null +++ b/java-data-handling-template.iml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/java/com/epam/izh/rd/online/repository/FileRepository.java b/src/main/java/com/epam/izh/rd/online/repository/FileRepository.java index 870e645f..be1653c6 100644 --- a/src/main/java/com/epam/izh/rd/online/repository/FileRepository.java +++ b/src/main/java/com/epam/izh/rd/online/repository/FileRepository.java @@ -1,5 +1,7 @@ package com.epam.izh.rd.online.repository; +import java.io.IOException; + public interface FileRepository { diff --git a/src/main/java/com/epam/izh/rd/online/repository/SimpleFileRepository.java b/src/main/java/com/epam/izh/rd/online/repository/SimpleFileRepository.java index 1783b845..515b9304 100644 --- a/src/main/java/com/epam/izh/rd/online/repository/SimpleFileRepository.java +++ b/src/main/java/com/epam/izh/rd/online/repository/SimpleFileRepository.java @@ -1,16 +1,38 @@ package com.epam.izh.rd.online.repository; +import java.io.*; +import java.nio.file.*; + +import static java.nio.file.StandardCopyOption.REPLACE_EXISTING; + public class SimpleFileRepository implements FileRepository { + private static String prePathForCountFiles = "src/main/resources/"; + private static String prePathForCountDirectory = "src/main/resources/"; /** * Метод рекурсивно подсчитывает количество файлов в директории * - * @param path путь до директори + * @param path путь до директории * @return файлов, в том числе скрытых */ @Override public long countFilesInDirectory(String path) { - return 0; + long count = 0; + File dir = new File(prePathForCountFiles + path); + if (dir.exists()) { + File[] files = dir.listFiles(); + for (File file : files) { + if (file.isFile()) { + count++; + } + if (file.isDirectory()) { + prePathForCountFiles = ""; + count = count + countFilesInDirectory(file.getPath()); + } + } + return count; + } + return count; } /** @@ -21,9 +43,26 @@ public long countFilesInDirectory(String path) { */ @Override public long countDirsInDirectory(String path) { - return 0; + long count = 0; + if (!prePathForCountDirectory.equals("")) { + count++; + } + File dir = new File(prePathForCountDirectory + path); + if (dir.exists()) { + File[] files = dir.listFiles(); + for (File file : files) { + if (file.isDirectory()) { + count++; + prePathForCountDirectory = ""; + count = count + countDirsInDirectory(file.getPath()); + } + } + return count; + } + return count; } + /** * Метод копирует все файлы с расширением .txt * @@ -32,9 +71,20 @@ public long countDirsInDirectory(String path) { */ @Override public void copyTXTFiles(String from, String to) { - return; + File src = new File(from); + File copyFile = new File(to); + File copyFileDirectory = new File(copyFile.getParent()); + if (!copyFileDirectory.isDirectory()) { + copyFileDirectory.mkdirs(); + } + try { + Files.copy(src.toPath(), copyFile.toPath()); + } catch (IOException e) { + e.printStackTrace(); + } } + /** * Метод создает файл на диске с расширением txt * @@ -44,6 +94,16 @@ public void copyTXTFiles(String from, String to) { */ @Override public boolean createFile(String path, String name) { + File dir = new File(getClass().getResource("/" + path).getPath()); + if (!dir.exists()) { + dir.mkdirs(); + } + File file = new File(dir.getPath() + "/" + name); + try { + return file.createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } return false; } @@ -55,6 +115,15 @@ public boolean createFile(String path, String name) { */ @Override public String readFileFromResources(String fileName) { - return null; + String content = ""; + try (BufferedReader bufferedReader = new BufferedReader(new FileReader("src/main/resources/" + fileName))) { + content = bufferedReader.readLine(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return content; } } + diff --git a/src/main/java/com/epam/izh/rd/online/service/SimpleBigNumbersService.java b/src/main/java/com/epam/izh/rd/online/service/SimpleBigNumbersService.java index a94c7bba..7799ca2d 100644 --- a/src/main/java/com/epam/izh/rd/online/service/SimpleBigNumbersService.java +++ b/src/main/java/com/epam/izh/rd/online/service/SimpleBigNumbersService.java @@ -2,18 +2,23 @@ import java.math.BigDecimal; import java.math.BigInteger; +import java.util.ArrayList; public class SimpleBigNumbersService implements BigNumbersService { + /** * Метод делит первое число на второе с заданной точностью * Например 1/3 с точностью 2 = 0.33 + * * @param range точность * @return результат */ @Override public BigDecimal getPrecisionNumber(int a, int b, int range) { - return null; + BigDecimal firstNumber = BigDecimal.valueOf(a); + BigDecimal secondNumber = BigDecimal.valueOf(b); + return firstNumber.divide(secondNumber, range, BigDecimal.ROUND_HALF_UP); } /** @@ -24,6 +29,14 @@ public BigDecimal getPrecisionNumber(int a, int b, int range) { */ @Override public BigInteger getPrimaryNumber(int range) { - return null; + int[] numbers = new int[range * range]; + ArrayList arrayNumbers = new ArrayList<>(); + for (int i = 2; i < numbers.length; i++) { + numbers[i] = i; + if (BigInteger.valueOf(numbers[i]).isProbablePrime(i)) { + arrayNumbers.add(BigInteger.valueOf(numbers[i])); + } + } + return arrayNumbers.get(range); } } diff --git a/src/main/java/com/epam/izh/rd/online/service/SimpleDateService.java b/src/main/java/com/epam/izh/rd/online/service/SimpleDateService.java index 70d64dfd..cc4718af 100644 --- a/src/main/java/com/epam/izh/rd/online/service/SimpleDateService.java +++ b/src/main/java/com/epam/izh/rd/online/service/SimpleDateService.java @@ -2,7 +2,12 @@ import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.Year; +import java.time.YearMonth; import java.time.format.DateTimeFormatter; +import java.time.temporal.TemporalField; +import java.util.GregorianCalendar; +import java.util.regex.Pattern; public class SimpleDateService implements DateService { @@ -14,9 +19,16 @@ public class SimpleDateService implements DateService { */ @Override public String parseDate(LocalDate localDate) { - return null; + String month = "0"; + if (localDate.getMonthValue() < 10) { + month = month + localDate.getMonthValue(); + } else { + month = "" + localDate.getMonthValue(); + } + return String.format("%d-%2s-%d", localDate.getDayOfMonth(), month, localDate.getYear()); } + /** * Метод парсит строку в дату * @@ -25,7 +37,12 @@ public String parseDate(LocalDate localDate) { */ @Override public LocalDateTime parseString(String string) { - return null; + int year = Integer.parseInt(string.substring(0, 4)); + int mount = Integer.parseInt(string.substring(5, 7)); + int days = Integer.parseInt(string.substring(8, 10)); + int hours = Integer.parseInt(string.substring(11, 13)); + int minutes = Integer.parseInt(string.substring(14, 16)); + return LocalDateTime.of(year, mount, days, hours, minutes); } /** @@ -37,7 +54,7 @@ public LocalDateTime parseString(String string) { */ @Override public String convertToCustomFormat(LocalDate localDate, DateTimeFormatter formatter) { - return null; + return localDate.format(formatter); } /** @@ -47,7 +64,12 @@ public String convertToCustomFormat(LocalDate localDate, DateTimeFormatter forma */ @Override public long getNextLeapYear() { - return 0; + long year = Year.now().getValue(); + do { + year++; + } while (!Year.isLeap(year)); + + return year; } /** @@ -57,7 +79,14 @@ public long getNextLeapYear() { */ @Override public long getSecondsInYear(int year) { - return 0; + int daysInYear = 365; + int hoursInDay = 24; + int minutesInHours = 60; + int secondsInMinutes = 60; + if (Year.isLeap(year)) { + daysInYear = 366; + } + return daysInYear * hoursInDay * minutesInHours * secondsInMinutes; } diff --git a/src/main/java/com/epam/izh/rd/online/service/SimpleRegExpService.java b/src/main/java/com/epam/izh/rd/online/service/SimpleRegExpService.java index b6eff56b..45c6b1fc 100644 --- a/src/main/java/com/epam/izh/rd/online/service/SimpleRegExpService.java +++ b/src/main/java/com/epam/izh/rd/online/service/SimpleRegExpService.java @@ -1,5 +1,9 @@ package com.epam.izh.rd.online.service; +import java.io.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public class SimpleRegExpService implements RegExpService { /** @@ -11,17 +15,55 @@ public class SimpleRegExpService implements RegExpService { */ @Override public String maskSensitiveData() { - return null; + String allMaskedText = ""; + try (FileReader fileReader = new FileReader("src/main/resources/sensitive_data.txt"); + BufferedReader bufferedReader = new BufferedReader(fileReader); + ) { + String allText = bufferedReader.readLine(); + Pattern pattern = Pattern.compile("\\b([0-9]{4})\\s[0-9]{0,9}\\s[0-9]{0,9}\\s([0-9]{4})\\b"); + Matcher matcher = pattern.matcher(allText); + String maskForCard = "$1 **** **** $2"; + if (matcher.find()) { + allMaskedText = matcher.replaceAll(maskForCard); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return allMaskedText; } /** - * Метод должен считыввать файл sensitive_data.txt (из директории resources) и заменять плейсхолдер ${payment_amount} и ${balance} на заданные числа. Метод должен + * Метод должен считывать файл sensitive_data.txt (из директории resources) и заменять плейсхолдер ${payment_amount} и ${balance} на заданные числа. Метод должен * содержать регулярное выражение для поиска плейсхолдеров * * @return обработанный текст */ @Override public String replacePlaceholders(double paymentAmount, double balance) { - return null; + String replacePlaceholderAllText = ""; + try (FileReader fileReader = new FileReader("src/main/resources/sensitive_data.txt"); + BufferedReader bufferedReader = new BufferedReader(fileReader); + ) { + String allText = bufferedReader.readLine(); + Pattern patternForBalance = Pattern.compile("\\$\\{balance\\}"); + Matcher matcherBalance = patternForBalance.matcher(allText); + String balanceReplace = String.format("%.0f", balance); + String paymentReplace = String.format("%.0f", paymentAmount); + if (matcherBalance.find()) { + String replacePlaceholderBalance = matcherBalance.replaceAll(balanceReplace); + Pattern patternForPayment = Pattern.compile("\\$\\{payment_amount\\}"); + Matcher matcherPayment = patternForPayment.matcher(replacePlaceholderBalance); + if (matcherPayment.find()) { + replacePlaceholderAllText = matcherPayment.replaceAll(paymentReplace); + } + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return replacePlaceholderAllText; } } diff --git a/src/main/java/com/epam/izh/rd/online/service/SimpleTextService.java b/src/main/java/com/epam/izh/rd/online/service/SimpleTextService.java index 68951fbe..16d09bac 100644 --- a/src/main/java/com/epam/izh/rd/online/service/SimpleTextService.java +++ b/src/main/java/com/epam/izh/rd/online/service/SimpleTextService.java @@ -1,64 +1,110 @@ package com.epam.izh.rd.online.service; +import java.util.Arrays; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public class SimpleTextService implements TextService { /** * Реализовать функционал удаления строки из другой строки. - * + *

* Например для базовой строки "Hello, hello, hello, how low?" и строки для удаления ", he" * метод вернет "Hellollollo, how low?" * - * @param base - базовая строка с текстом + * @param base - базовая строка с текстом * @param remove - строка которую необходимо удалить */ @Override public String removeString(String base, String remove) { - return null; //TODO + Pattern pattern = Pattern.compile(remove); + Matcher matcher = pattern.matcher(base); + String removeBase = ""; + if (matcher.find()) { + removeBase = matcher.replaceAll(""); + } else { + return base; + } + return removeBase; //TODO } /** * Реализовать функционал проверки на то, что строка заканчивается знаком вопроса. - * + *

* Например для строки "Hello, hello, hello, how low?" метод вернет true * Например для строки "Hello, hello, hello!" метод вернет false */ @Override public boolean isQuestionString(String text) { - return false; //TODO + Pattern pattern = Pattern.compile(".$"); + Matcher matcher = pattern.matcher(text); + if (matcher.find()) { + return matcher.group().equals("?"); + } + return false; + //TODO } /** * Реализовать функционал соединения переданных строк. - * + *

* Например для параметров {"Smells", " ", "Like", " ", "Teen", " ", "Spirit"} * метод вернет "Smells Like Teen Spirit" */ @Override public String concatenate(String... elements) { - return null; //TODO + StringBuilder builder = new StringBuilder(); + for (int i = 0; i < elements.length; i++) { + builder.append(elements[i]); + } + String returnedString = String.valueOf(builder); + return returnedString; //TODO } /** * Реализовать функционал изменения регистра в вид лесенки. * Возвращаемый текст должен начинаться с прописного регистра. - * + *

* Например для строки "Load Up On Guns And Bring Your Friends" * метод вернет "lOaD Up oN GuNs aNd bRiNg yOuR FrIeNdS". */ @Override public String toJumpCase(String text) { - return null; //TODO + String textToLowerCase = text.toLowerCase(); + String textToUpperCase = text.toUpperCase(); + char[] charsLower = textToLowerCase.toCharArray(); + char[] charsUpper = textToUpperCase.toCharArray(); + char[] charsArray = new char[charsLower.length]; + for (int i = 0; i < charsLower.length; i++) { + if (i % 2 == 0) { + charsArray[i] = charsLower[i]; + } else { + charsArray[i] = charsUpper[i]; + } + } + String fes = String.valueOf(charsArray); + + + return fes; //TODO } /** * Метод определяет, является ли строка палиндромом. - * + *

* Палиндром - строка, которая одинаково читается слева направо и справа налево. - * + *

* Например для строки "а роза упала на лапу Азора" вернется true, а для "я не палиндром" false */ @Override public boolean isPalindrome(String string) { - return false; //TODO + String palindrome = string.replace(" ", "").toLowerCase(); + StringBuilder palindromeBuilder = new StringBuilder(palindrome); + StringBuilder palindromeBuilderReverse = palindromeBuilder.reverse(); + String palindromeReverse = String.valueOf(palindromeBuilderReverse); + if (!string.equals("")) { + return palindrome.equals(palindromeReverse); + } else { + return false; + } } } diff --git a/src/main/resources/sensitive_data.txt b/src/main/resources/sensitive_data.txt index 4041aa51..58e01a12 100644 --- a/src/main/resources/sensitive_data.txt +++ b/src/main/resources/sensitive_data.txt @@ -1 +1 @@ -Вчера вечером со счета номер 4301 0234 2145 2140 был совершен перевод на счет 5042 2012 0532 2043 в размере ${payment_amount} рублей. На счету осталось ${balance} рублей +Вчера вечером со счета номер 4301 0234 2145 2140 был совершен перевод на счет 5042 2012 0532 2043 в размере ${payment_amount} рублей. На счету осталось ${balance} рублей \ No newline at end of file