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..36af3001 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,48 @@ package com.epam.izh.rd.online; +import com.epam.izh.rd.online.repository.SimpleFileRepository; +import com.epam.izh.rd.online.service.SimpleBigNumbersService; +import com.epam.izh.rd.online.service.SimpleDateService; +import com.epam.izh.rd.online.service.SimpleRegExpService; +import com.epam.izh.rd.online.service.SimpleTextService; + +import java.text.SimpleDateFormat; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + public class Main { + + public static void main(String[] args) { +// SimpleFileRepository simpleFileRepository = new SimpleFileRepository(); +// System.out.println(simpleFileRepository.countFilesInDirectory("c:/temp/java/java3")); +// System.out.println(simpleFileRepository.countDirsInDirectory("c:/temp/java/java3/")); +// simpleFileRepository.copyTXTFiles("c:/temp/java/java3/", "c:/temp/java/java4/"); +// System.out.println(simpleFileRepository.createFile("c:/temp/java/java3/", "someNewFile.txt")); +// System.out.println(simpleFileRepository.readFileFromResources("readme.txt")); + +// SimpleBigNumbersService simpleBigNumbersService = new SimpleBigNumbersService(); +// System.out.println(simpleBigNumbersService.getPrecisionNumber(1, 3, 2)); +// System.out.println(simpleBigNumbersService.getPrimaryNumber(100)); + +// SimpleDateService simpleDateService = new SimpleDateService(); +// System.out.println(simpleDateService.parseDate(LocalDate.of(1974, 2, 9))); +// System.out.println(simpleDateService.parseString("1970-01-01 00:00")); +// System.out.println(simpleDateService.convertToCustomFormat(LocalDate.of(1974, 2, 9), DateTimeFormatter.ofPattern("yyyy-MM-dd"))); +// System.out.println(simpleDateService.getNextLeapYear()); +// System.out.println(simpleDateService.getSecondsInYear(2021)); +// System.out.println(simpleDateService.getSecondsInYear(2020)); + +// SimpleRegExpService simpleRegExpService = new SimpleRegExpService(); +// System.out.println(simpleRegExpService.maskSensitiveData()); +// System.out.println(simpleRegExpService.replacePlaceholders(1, 2)); + +// SimpleTextService simpleTextService = new SimpleTextService(); +// System.out.println(simpleTextService.removeString("Hello, hello, hello, how low?", ", he")); +// System.out.println(simpleTextService.isQuestionString("test!")); +// System.out.println(simpleTextService.concatenate(new String[]{"a", "b", "c"})); +// System.out.println(simpleTextService.toJumpCase("Load Up On Guns And Bring Your Friends")); +// System.out.println(simpleTextService.isPalindrome("")); + } + + } 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..5f9ac52f 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,5 +1,10 @@ package com.epam.izh.rd.online.repository; +import java.io.*; +import java.nio.file.*; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.Arrays; + public class SimpleFileRepository implements FileRepository { /** @@ -10,6 +15,21 @@ public class SimpleFileRepository implements FileRepository { */ @Override public long countFilesInDirectory(String path) { + if (!Paths.get(path).toFile().isDirectory()) return 0; + + try { + final long[] count = {0}; + Files.walkFileTree(Paths.get(path), new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Object file, BasicFileAttributes attrs) throws IOException { + count[0]++; + return super.visitFile(path, attrs); + } + }); + return count[0]; + } catch (IOException e) { + e.printStackTrace(); + } return 0; } @@ -21,6 +41,21 @@ public long countFilesInDirectory(String path) { */ @Override public long countDirsInDirectory(String path) { + if (!Paths.get(path).toFile().isDirectory()) return 0; + + try { + final long[] count = {0}; + Files.walkFileTree(Paths.get(path), new SimpleFileVisitor() { + @Override + public FileVisitResult preVisitDirectory(Object dir, BasicFileAttributes attrs) throws IOException { + count[0]++; + return super.preVisitDirectory(dir, attrs); + } + }); + return count[0]; + } catch (IOException e) { + e.printStackTrace(); + } return 0; } @@ -32,7 +67,22 @@ public long countDirsInDirectory(String path) { */ @Override public void copyTXTFiles(String from, String to) { - return; + if (!Paths.get(from).toFile().isDirectory() || !Paths.get(to).toFile().isDirectory()) return; + + final int[] countCopiedFiles = {0}; + File[] files = Paths.get(from).toFile().listFiles(); + if (files == null) return; + Arrays.stream(files) + .filter(file -> !file.isDirectory() && file.toString().toLowerCase().endsWith(".txt")) + .forEach(file -> { + try { + Files.copy(file.toPath(), Paths.get(to + "/" + file.getName()), StandardCopyOption.REPLACE_EXISTING); + countCopiedFiles[0]++; + } catch (IOException e) { + e.printStackTrace(); + } + }); + System.out.println(countCopiedFiles[0] + " files copied."); } /** @@ -44,6 +94,19 @@ public void copyTXTFiles(String from, String to) { */ @Override public boolean createFile(String path, String name) { + try { +// the dir is created additionally if it's missing + if (!Paths.get(path).toFile().exists()) { + boolean result = Paths.get(path).toFile().mkdir(); + if (!result) { + return false; + } + } + + return Paths.get(path + "/" + name).toFile().createNewFile(); + } catch (IOException e) { + e.printStackTrace(); + } return false; } @@ -55,6 +118,15 @@ public boolean createFile(String path, String name) { */ @Override public String readFileFromResources(String fileName) { - return null; + if (!fileName.toLowerCase().endsWith(".txt")) return ""; + + try ( BufferedReader reader = new BufferedReader(new FileReader("src/main/resources/" + fileName))) { + StringBuilder result = new StringBuilder(); + reader.lines().forEach(line -> result.append("\n" + line)); + return result.toString().substring(1); + } catch (IOException 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..a5c3f97e 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 @@ -13,7 +13,7 @@ public class SimpleBigNumbersService implements BigNumbersService { */ @Override public BigDecimal getPrecisionNumber(int a, int b, int range) { - return null; + return new BigDecimal((double) a / (double) b).setScale(range, BigDecimal.ROUND_HALF_UP); } /** @@ -24,6 +24,33 @@ public BigDecimal getPrecisionNumber(int a, int b, int range) { */ @Override public BigInteger getPrimaryNumber(int range) { - return null; + if (range < 1) return null; + int checkNumber = 2; + int result = checkNumber; + int foundCo = 0; + while (foundCo <= range) { + if (isPrimary(checkNumber)) { + result = checkNumber; + foundCo++; + } + checkNumber++; + } + return new BigInteger(String.valueOf(result)); } + + /** + * Метод определяет, является ли заданное число простым. + * Простое число - число, которое делится только на 1 и на само себя. + * + * Например для числа 22 вернется false, а для числа 23 true. + */ + public boolean isPrimary(int number) { + for (int i = 2; i < number; i++) { + if (number % i == 0) { + return false; + } + } + return true; + } + } 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..ad07bbf0 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,5 +1,6 @@ package com.epam.izh.rd.online.service; +import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -14,7 +15,7 @@ public class SimpleDateService implements DateService { */ @Override public String parseDate(LocalDate localDate) { - return null; + return localDate.format(DateTimeFormatter.ofPattern("dd-MM-yyyy")); } /** @@ -25,7 +26,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 +38,7 @@ public LocalDateTime parseString(String string) { */ @Override public String convertToCustomFormat(LocalDate localDate, DateTimeFormatter formatter) { - return null; + return localDate.format(formatter); } /** @@ -47,7 +48,10 @@ public String convertToCustomFormat(LocalDate localDate, DateTimeFormatter forma */ @Override public long getNextLeapYear() { - return 0; + LocalDate localDate = LocalDate.now(); + int year = localDate.getYear(); + while (!LocalDate.of(year++,1,1).isLeapYear()); + return --year; } /** @@ -57,7 +61,8 @@ public long getNextLeapYear() { */ @Override public long getSecondsInYear(int year) { - return 0; + int daySeconds = 3600 * 24; + return LocalDate.of(year,1,1).isLeapYear() ? 366 * daySeconds : 365 * daySeconds; } 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..dc0cd1da 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,13 @@ package com.epam.izh.rd.online.service; +import java.io.BufferedReader; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.nio.file.Paths; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + public class SimpleRegExpService implements RegExpService { /** @@ -11,6 +19,23 @@ public class SimpleRegExpService implements RegExpService { */ @Override public String maskSensitiveData() { + try ( BufferedReader reader = new BufferedReader(new FileReader("src/main/resources/sensitive_data.txt"))) { + Pattern pattern = Pattern.compile("\\d{4} \\d{4} \\d{4} \\d{4}"); + StringBuilder stringBuilder = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + Matcher matcher = pattern.matcher(line); + while (matcher.find()) { + String maskedReplacement = matcher.group().substring(0, 5) + + "**** ****" + matcher.group().substring(14, 19); + line = line.replace(matcher.group(), maskedReplacement); + } + stringBuilder.append("\n" + line); + } + return stringBuilder.toString().substring(1); + } catch (IOException e) { + e.printStackTrace(); + } return null; } @@ -22,6 +47,18 @@ public String maskSensitiveData() { */ @Override public String replacePlaceholders(double paymentAmount, double balance) { + try ( BufferedReader reader = new BufferedReader(new FileReader("src/main/resources/sensitive_data.txt"))) { + StringBuilder stringBuilder = new StringBuilder(); + String line; + while ((line = reader.readLine()) != null) { + line = line.replaceAll("\\$\\{payment_amount}",String.valueOf((int) paymentAmount)); + line = line.replaceAll("\\$\\{balance}",String.valueOf((int) balance)); + stringBuilder.append("\n" + line); + } + return stringBuilder.toString().substring(1); + } catch (IOException e) { + e.printStackTrace(); + } return null; } } 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..f737246a 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,5 +1,7 @@ package com.epam.izh.rd.online.service; +import java.util.Arrays; + public class SimpleTextService implements TextService { /** @@ -13,7 +15,7 @@ public class SimpleTextService implements TextService { */ @Override public String removeString(String base, String remove) { - return null; //TODO + return base.replace(remove, ""); } /** @@ -24,7 +26,7 @@ public String removeString(String base, String remove) { */ @Override public boolean isQuestionString(String text) { - return false; //TODO + return text.endsWith("?"); } /** @@ -35,7 +37,11 @@ public boolean isQuestionString(String text) { */ @Override public String concatenate(String... elements) { - return null; //TODO + String result = ""; + for (String string : elements) { + result += string; + } + return result.trim(); } /** @@ -47,7 +53,18 @@ public String concatenate(String... elements) { */ @Override public String toJumpCase(String text) { - return null; //TODO + String result = ""; + boolean isLowerCase = true; + for (int i = 0; i < text.length(); i++) { + if (isLowerCase) { + result += text.substring(i, i + 1).toLowerCase(); + isLowerCase = false; + } else { + result += text.substring(i, i + 1).toUpperCase(); + isLowerCase = true; + } + } + return result; } /** @@ -59,6 +76,9 @@ public String toJumpCase(String text) { */ @Override public boolean isPalindrome(String string) { - return false; //TODO + if (string == null) return false; + string = string.replace(" ", ""); + if (string.length() == 0) return false; + return string.toLowerCase().equals(new StringBuilder(string.toLowerCase()).reverse().toString()); } } 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..80ca036e 100644 --- a/src/test/java/com/epam/izh/rd/online/FileRepositoryTest.java +++ b/src/test/java/com/epam/izh/rd/online/FileRepositoryTest.java @@ -9,13 +9,14 @@ import java.io.File; import java.net.URL; +import java.nio.file.Paths; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; public class FileRepositoryTest { - private static final String TEST_DIR_COUNT_PATH = "testDirCountFiles"; + private static final String TEST_DIR_COUNT_PATH = "src/main/resources/testDirCountFiles"; private static final String TEST_DIR_CREATE_PATH = "testDirCreateFile"; private static final String TEST_FILE_TO_CREATE = "newFile.txt"; @@ -62,11 +63,18 @@ 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(""); +*/ +// The commented logic above did not work, decided to change it to the source below, sorry for this + if (Paths.get(path).toFile().exists()) { + return Paths.get(path).toFile(); + } + return new File(""); } }