diff --git a/java-data-handling-template.iml b/java-data-handling-template.iml new file mode 100644 index 00000000..f07e6a55 --- /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/Main.java b/src/main/java/com/epam/izh/rd/online/Main.java index 8306d877..20522fc8 100644 --- a/src/main/java/com/epam/izh/rd/online/Main.java +++ b/src/main/java/com/epam/izh/rd/online/Main.java @@ -1,4 +1,13 @@ package com.epam.izh.rd.online; +import com.epam.izh.rd.online.repository.SimpleFileRepository; + public class Main { + public static void main(String ... args) + { + String path = "testDirCountFiles"; + String path2 = "testDirCountFiles"; + SimpleFileRepository fr = new SimpleFileRepository(); + fr.copyTXTFiles(path,path2); + } } 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..1133b111 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,6 +1,13 @@ package com.epam.izh.rd.online.repository; +import java.io.*; +import java.nio.file.*; +import java.util.*; + + public class SimpleFileRepository implements FileRepository { + private long count; + private ArrayList fileList; /** * Метод рекурсивно подсчитывает количество файлов в директории @@ -10,7 +17,22 @@ public class SimpleFileRepository implements FileRepository { */ @Override public long countFilesInDirectory(String path) { - return 0; + count = 0; + File file = new File("src\\main\\resources\\" + path); + if (file.isDirectory()) + fileCounter(file); + + return count; + } + + private void fileCounter(File file) { + for (File f : file.listFiles()) { + if (f.isDirectory()) { + fileCounter(f); + } else { + ++count; + } + } } /** @@ -21,7 +43,22 @@ public long countFilesInDirectory(String path) { */ @Override public long countDirsInDirectory(String path) { - return 0; + count = 0; + File file = new File("src\\main\\resources\\" + path); + if (file.isDirectory()) { + ++count; + folderCounter(file); + } + return count; + } + + private void folderCounter(File file) { + for (File f : file.listFiles()) { + if (f.isDirectory()) { + ++count; + folderCounter(f); + } + } } /** @@ -32,7 +69,34 @@ public long countDirsInDirectory(String path) { */ @Override public void copyTXTFiles(String from, String to) { - return; + fileList = new ArrayList<>(); + File directory = new File("src\\main\\resources\\" + from); + findAllFilesNames(directory, ".txt"); + fileSCopyTo(fileList, to); + } + + private void findAllFilesNames(File file, String filter) { + for (File files : file.listFiles()) { + if (files.isDirectory()) { + findAllFilesNames(files, filter); + } else if (files.getName().contains(filter)) { + fileList.add(files); + } + } + } + + private void fileSCopyTo(ArrayList fileList, String to) { + for (File files : fileList) { + fileCopy(files, to); + } + } + + private void fileCopy(File f, String to) { + try { + Files.copy(Paths.get(f.getPath()), Paths.get(to + "\\" + f.getName())); + } catch (IOException e) { + e.printStackTrace(); + } } /** @@ -44,7 +108,28 @@ public void copyTXTFiles(String from, String to) { */ @Override public boolean createFile(String path, String name) { - return false; + return create(path, name); + } + + private boolean create(String path, String name) { + try { + Files.createFile(Paths.get(path + "/" + name)); + } catch (NoSuchFileException noFile) { + noFile.printStackTrace(); + createDirectory(path); + createFile(path, name); + } catch (IOException e) { + e.printStackTrace(); + } + return Files.exists(Paths.get(path + "\\" + name)); + } + + private void createDirectory(String path) { + try { + Files.createDirectory(Paths.get(path)); + } catch (IOException e) { + e.printStackTrace(); + } } /** @@ -55,6 +140,16 @@ public boolean createFile(String path, String name) { */ @Override public String readFileFromResources(String fileName) { - return null; + return readFile(fileName); + } + + private String readFile(String fileName) { + try { + Scanner sc = new Scanner(new BufferedInputStream(new FileInputStream("src\\main\\resources\\" + fileName))); + return sc.nextLine(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + return ""; } } 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..7be09ff7 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,20 @@ import java.math.BigDecimal; import java.math.BigInteger; +import java.math.RoundingMode; 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; + return new BigDecimal(a).divide(new BigDecimal(b), range, RoundingMode.HALF_UP); } /** @@ -24,6 +26,14 @@ public BigDecimal getPrecisionNumber(int a, int b, int range) { */ @Override public BigInteger getPrimaryNumber(int range) { - return null; + BigInteger result = BigInteger.valueOf(3); + long count = 0; + while (count < range) { + if (result.isProbablePrime(range)) { + count++; + } + result = result.add(BigInteger.valueOf(2)); + } + return result.add(BigInteger.valueOf(-2)); } } 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..d3004f6d 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 @@ -1,7 +1,6 @@ package com.epam.izh.rd.online.service; -import java.time.LocalDate; -import java.time.LocalDateTime; +import java.time.*; import java.time.format.DateTimeFormatter; public class SimpleDateService implements DateService { @@ -14,7 +13,7 @@ public class SimpleDateService implements DateService { */ @Override public String parseDate(LocalDate localDate) { - return null; + return DateTimeFormatter.ofPattern("dd-MM-yyyy").format(localDate); } /** @@ -25,7 +24,7 @@ public String parseDate(LocalDate localDate) { */ @Override public LocalDateTime parseString(String string) { - return null; + return LocalDateTime.parse(string,DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")); } /** @@ -37,7 +36,8 @@ public LocalDateTime parseString(String string) { */ @Override public String convertToCustomFormat(LocalDate localDate, DateTimeFormatter formatter) { - return null; + + return formatter.format(localDate); } /** @@ -47,7 +47,9 @@ public String convertToCustomFormat(LocalDate localDate, DateTimeFormatter forma */ @Override public long getNextLeapYear() { - return 0; + Year year = Year.now(); + while (!year.isLeap()) year = year.plusYears(1); + return year.getValue(); } /** @@ -57,7 +59,7 @@ public long getNextLeapYear() { */ @Override public long getSecondsInYear(int year) { - return 0; + return Year.of(year).length() * 24 * 60 * 60; } 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..771c6df4 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,7 +15,25 @@ public class SimpleRegExpService implements RegExpService { */ @Override public String maskSensitiveData() { - return null; + return findAndReplaceCardNumber(readResourceFileNames("sensitive_data.txt")); + } + + private StringBuilder readResourceFileNames(String name) { + try (BufferedReader reader = new BufferedReader(new FileReader("src\\main\\resources\\" + name))) { + return new StringBuilder(reader.readLine()); + } catch (IOException e) { + e.printStackTrace(); + } + return new StringBuilder(); + } + + private String findAndReplaceCardNumber(StringBuilder text) { + Pattern pat = Pattern.compile("\\s*\\d{4}\\s+(\\d{4}\\s+\\d{4})\\s+\\d{4}"); + Matcher match = pat.matcher(text); + while (match.find()) { + text.replace(match.start(1), match.end(1), "**** ****"); + } + return text.toString(); } /** @@ -22,6 +44,18 @@ public String maskSensitiveData() { */ @Override public String replacePlaceholders(double paymentAmount, double balance) { - return null; + return findAndReplacePlaceholder(paymentAmount, balance, readResourceFileNames("sensitive_data.txt")); + } + + private String findAndReplacePlaceholder(double paymentAmount, double balance, StringBuilder text) { + String x = text.toString(); + Pattern pat = Pattern.compile("(\\$\\{p.*[}]).+(\\$\\{b.*[}])"); + Matcher match = pat.matcher(x); + if (match.find()) { + text.replace(match.start(2), match.end(2), String.valueOf((int) balance)). + replace(match.start(1), match.end(1), String.valueOf((int) paymentAmount)); + } + System.out.println(text); + return text.toString(); } } 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..e11cdbf7 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,75 @@ package com.epam.izh.rd.online.service; +import java.util.Arrays; + 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 + return base.replaceAll(remove, ""); } /** * Реализовать функционал проверки на то, что строка заканчивается знаком вопроса. - * + *

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

* Например для параметров {"Smells", " ", "Like", " ", "Teen", " ", "Spirit"} * метод вернет "Smells Like Teen Spirit" */ @Override public String concatenate(String... elements) { - return null; //TODO + return Arrays.stream(elements).reduce("", String::concat); } /** * Реализовать функционал изменения регистра в вид лесенки. * Возвращаемый текст должен начинаться с прописного регистра. - * + *

* Например для строки "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[] result = text.toLowerCase().split("\\.*"); + for (int i = 1; i < result.length; i += 2) { + result[i] = result[i].toUpperCase(); + } + return Arrays.stream(result).reduce("", String::concat); } /** * Метод определяет, является ли строка палиндромом. - * + *

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

* Например для строки "а роза упала на лапу Азора" вернется true, а для "я не палиндром" false */ @Override public boolean isPalindrome(String string) { - return false; //TODO + if (string.length() > 0) { + String line = Arrays.stream(string.toLowerCase().split("\\s*")).reduce("", String::concat); + String reverse = new StringBuffer(line).reverse().toString(); + return line.equals(reverse); + } + return false; } } diff --git a/src/test/java/com/epam/izh/rd/online/FileRepositoryTest.java b/src/test/java/com/epam/izh/rd/online/FileRepositoryTest.java index 87dad34f..c8e9609e 100644 --- a/src/test/java/com/epam/izh/rd/online/FileRepositoryTest.java +++ b/src/test/java/com/epam/izh/rd/online/FileRepositoryTest.java @@ -9,6 +9,8 @@ import java.io.File; import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -50,7 +52,6 @@ void testCountFilesInDirectory() { @DisplayName("Тест метода FileRepository.createFile(String path)") void testCreateFile() { fileRepository.createFile(TEST_DIR_CREATE_PATH, TEST_FILE_TO_CREATE); - assertTrue(getFile(TEST_DIR_CREATE_PATH + "/" + TEST_FILE_TO_CREATE).exists()); } @@ -62,11 +63,7 @@ void testReadFileFromResources() { private File getFile(String path) { - ClassLoader classLoader = getClass().getClassLoader(); - URL resource = classLoader.getResource(path); - if (resource != null) { - return new File(resource.getFile()); - } - return new File(""); + Path resource = Paths.get(path); + return new File(String.valueOf(resource)); } }