diff --git a/build.gradle b/build.gradle index c76d6984..99b4dee6 100644 --- a/build.gradle +++ b/build.gradle @@ -27,7 +27,7 @@ subprojects { } dependencies { - compile group: 'junit', name: 'junit', version: '4.12' - compile group: 'org.assertj', name: 'assertj-core', version: '3.10.0' + implementation group: 'junit', name: 'junit', version: '4.12' + implementation group: 'org.assertj', name: 'assertj-core', version: '3.10.0' } } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index a0f9e7ba..349c0f72 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Tue Oct 02 17:25:09 YEKT 2018 +#Tue Nov 25 03:59:51 YEKT 2025 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.8.1-all.zip diff --git a/task01/src/com/example/task01/Level.java b/task01/src/com/example/task01/Level.java new file mode 100644 index 00000000..0e719c89 --- /dev/null +++ b/task01/src/com/example/task01/Level.java @@ -0,0 +1,8 @@ +package com.example.task01; + +public enum Level { + DEBUG, + INFO, + WARNING, + ERROR +} \ No newline at end of file diff --git a/task01/src/com/example/task01/Logger.java b/task01/src/com/example/task01/Logger.java new file mode 100644 index 00000000..1c9ad30d --- /dev/null +++ b/task01/src/com/example/task01/Logger.java @@ -0,0 +1,73 @@ +package com.example.task01; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; + +public class Logger { + private String name; + private Level level; + private static ArrayList loggers = new ArrayList(); + public Logger(String name) { + this.name = name; + } + public String getName(){ + return name; + } + public static Logger getLogger(String name){ + for (int i= 0; i< loggers.size();i++){ + if(loggers.get(i).getName().equals(name)){ + return loggers.get(i); + } + } + Logger logger = new Logger(name); + loggers.add(logger); + return logger; + } + public void setLevel(Level level) { + this.level = level; + } + public Level getLevel() { + return level; + } + private String formatMessage(Level level, String Message){ + String date = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()); + + return String.format("[%s] %s %s - %s", level.name(), date, this.name, Message); + } + public void log(Level level, String message){ + + if(level.compareTo(this.level) >= 0){ + System.out.println(formatMessage(level, message)); + } + } + public void log(Level level, String format, Object... args){ + if(level.compareTo(this.level) >= 0){ + System.out.println(formatMessage(level, String.format(format, args))); + } + } + public void debug(String message){ + log(Level.DEBUG, message); + } + public void debug(String format, Object... args){ + log(Level.DEBUG,format,args); + } + public void info(String message){ + log(Level.INFO, message); + } + public void info(String format, Object... args){ + log(Level.INFO, format, args); + } + public void warning(String message){ + log(Level.WARNING, message); + } + public void warning(String format, Object... args){ + log(Level.WARNING, format, args); + } + public void error(String message){ + log(Level.ERROR, message); + } + public void error(String format, Object... args){ + log(Level.ERROR, format, args); + } +} \ No newline at end of file diff --git a/task02/src/com/example/task02/DiscountBill.java b/task02/src/com/example/task02/DiscountBill.java new file mode 100644 index 00000000..5908d7b3 --- /dev/null +++ b/task02/src/com/example/task02/DiscountBill.java @@ -0,0 +1,18 @@ +package com.example.task02; + +public class DiscountBill extends Bill{ + private final double discount; + public DiscountBill(int discount) { + this.discount = discount; + } + public String getDiscount() { + return discount + "%"; + } + public long getAbsoluteDiscount(){ + return (long)(super.getPrice() * ((double)discount / 100)); + } + @Override + public long getPrice() { + return super.getPrice() - getAbsoluteDiscount(); + } +} \ No newline at end of file diff --git a/task03/src/com/example/task03/Milliseconds.java b/task03/src/com/example/task03/Milliseconds.java index 5115bc7d..e004bf60 100644 --- a/task03/src/com/example/task03/Milliseconds.java +++ b/task03/src/com/example/task03/Milliseconds.java @@ -18,11 +18,11 @@ public long toMillis() { @Override public long toSeconds() { - return amount / 1000; + return Math.round(amount / 1000.0); // Округление по правилам } @Override public long toMinutes() { - return amount / 1000 * 60; + return Math.round(amount / (1000.0 * 60)); // Округление по правилам } -} +} \ No newline at end of file diff --git a/task03/src/com/example/task03/Minutes.java b/task03/src/com/example/task03/Minutes.java index d6fa0594..3283731b 100644 --- a/task03/src/com/example/task03/Minutes.java +++ b/task03/src/com/example/task03/Minutes.java @@ -1,27 +1,24 @@ package com.example.task03; public class Minutes implements TimeUnit { + private final long amount; public Minutes(long amount) { - // TODO: реализовать - throw new UnsupportedOperationException(); + this.amount = amount; } @Override public long toMillis() { - // TODO: реализовать - throw new UnsupportedOperationException(); + return amount * 60 * 1000; } @Override public long toSeconds() { - // TODO: реализовать - throw new UnsupportedOperationException(); + return amount * 60; } @Override public long toMinutes() { - // TODO: реализовать - throw new UnsupportedOperationException(); + return amount; } -} +} \ No newline at end of file diff --git a/task03/src/com/example/task03/Seconds.java b/task03/src/com/example/task03/Seconds.java index ce6bc213..2bc7363e 100644 --- a/task03/src/com/example/task03/Seconds.java +++ b/task03/src/com/example/task03/Seconds.java @@ -23,6 +23,6 @@ public long toSeconds() { @Override public long toMinutes() { - return Math.round(amount / 60); + return Math.round(amount / 60.0); // Округление по правилам } -} +} \ No newline at end of file diff --git a/task03/src/com/example/task03/TimeUnitUtils.java b/task03/src/com/example/task03/TimeUnitUtils.java index 790f8850..4248ef7b 100644 --- a/task03/src/com/example/task03/TimeUnitUtils.java +++ b/task03/src/com/example/task03/TimeUnitUtils.java @@ -24,4 +24,4 @@ public static Milliseconds toMillis(Seconds seconds) { public static Seconds toSeconds(Milliseconds millis) { return new Seconds(millis.toSeconds()); } -} +} \ No newline at end of file diff --git a/task04/src/com/example/task04/ConsoleHandler.java b/task04/src/com/example/task04/ConsoleHandler.java new file mode 100644 index 00000000..188e141f --- /dev/null +++ b/task04/src/com/example/task04/ConsoleHandler.java @@ -0,0 +1,11 @@ +package com.example.task04; + +/** + * Обработчик, выводящий сообщения в консоль + */ +public class ConsoleHandler implements MessageHandler { + @Override + public void handle(String message) { + System.out.println(message); + } +} \ No newline at end of file diff --git a/task04/src/com/example/task04/FileHandler.java b/task04/src/com/example/task04/FileHandler.java new file mode 100644 index 00000000..14ba5504 --- /dev/null +++ b/task04/src/com/example/task04/FileHandler.java @@ -0,0 +1,25 @@ +package com.example.task04; + +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; + +/** + * Обработчик, выводящий сообщения в файл + */ +public class FileHandler implements MessageHandler { + private final String filePath; + + public FileHandler(String filePath) { + this.filePath = filePath; + } + + @Override + public void handle(String message) { + try (Writer writer = new FileWriter(filePath, true)) { + writer.write(message + System.lineSeparator()); + } catch (IOException e) { + System.err.println("Ошибка записи в файл: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/task04/src/com/example/task04/Logger.java b/task04/src/com/example/task04/Logger.java new file mode 100644 index 00000000..829a2de6 --- /dev/null +++ b/task04/src/com/example/task04/Logger.java @@ -0,0 +1,95 @@ +package com.example.task04; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +/** + * Продвинутый логгер с поддержкой multiple handlers + */ +public class Logger { + private final String name; + private final List handlers; + private Level level; + + public enum Level { + DEBUG, + INFO, + WARNING, + ERROR + } + + public Logger(String name) { + this.name = name; + this.handlers = new ArrayList<>(); + this.level = Level.DEBUG; + } + + public Logger(String name, Level level) { + this(name); + this.level = level; + } + + /** + * Добавляет обработчик сообщений + * @param handler обработчик для добавления + */ + public void addHandler(MessageHandler handler) { + handlers.add(handler); + } + + /** + * Устанавливает уровень логирования + * @param level уровень логирования + */ + public void setLevel(Level level) { + this.level = level; + } + + /** + * @return уровень логирования + */ + public Level getLevel() { + return level; + } + + /** + * @return имя логгера + */ + public String getName() { + return name; + } + + private void log(Level level, String message) { + if (level.ordinal() < this.level.ordinal()) { + return; + } + + String formattedMessage = String.format("[%s] %s %s - %s", + level, + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")), + name, + message); + + for (MessageHandler handler : handlers) { + handler.handle(formattedMessage); + } + } + + public void debug(String message) { + log(Level.DEBUG, message); + } + + public void info(String message) { + log(Level.INFO, message); + } + + public void warning(String message) { + log(Level.WARNING, message); + } + + public void error(String message) { + log(Level.ERROR, message); + } +} \ No newline at end of file diff --git a/task04/src/com/example/task04/MemoryHandler.java b/task04/src/com/example/task04/MemoryHandler.java new file mode 100644 index 00000000..81c381ee --- /dev/null +++ b/task04/src/com/example/task04/MemoryHandler.java @@ -0,0 +1,45 @@ +package com.example.task04; + +import java.util.ArrayList; +import java.util.List; + +/** + * Обработчик-прокси, аккумулирующий сообщения в памяти + */ +public class MemoryHandler implements MessageHandler { + private final MessageHandler targetHandler; + private final int bufferSize; + private final List buffer; + + public MemoryHandler(MessageHandler targetHandler, int bufferSize) { + this.targetHandler = targetHandler; + this.bufferSize = bufferSize; + this.buffer = new ArrayList<>(); + } + + @Override + public void handle(String message) { + buffer.add(message); + + if (buffer.size() >= bufferSize) { + flush(); + } + } + + /** + * Принудительно отправляет накопленные сообщения в целевой обработчик + */ + public void flush() { + for (String message : buffer) { + targetHandler.handle(message); + } + buffer.clear(); + } + + /** + * @return количество сообщений в буфере + */ + public int getBufferSize() { + return buffer.size(); + } +} \ No newline at end of file diff --git a/task04/src/com/example/task04/MessageHandler.java b/task04/src/com/example/task04/MessageHandler.java new file mode 100644 index 00000000..c8a3d277 --- /dev/null +++ b/task04/src/com/example/task04/MessageHandler.java @@ -0,0 +1,12 @@ +package com.example.task04; + +/** + * Обработчик сообщений логгера + */ +public interface MessageHandler { + /** + * Обрабатывает сообщение логгера + * @param message сообщение для обработки + */ + void handle(String message); +} \ No newline at end of file diff --git a/task04/src/com/example/task04/RotationFileHandler.java b/task04/src/com/example/task04/RotationFileHandler.java new file mode 100644 index 00000000..7d3a512a --- /dev/null +++ b/task04/src/com/example/task04/RotationFileHandler.java @@ -0,0 +1,63 @@ +package com.example.task04; + +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; + +/** + * Обработчик, выводящий сообщения в файл с ротацией + */ +public class RotationFileHandler implements MessageHandler { + private final String basePath; + private final ChronoUnit rotationUnit; + private LocalDateTime currentRotationTime; + private String currentFilePath; + + public RotationFileHandler(String basePath, ChronoUnit rotationUnit) { + this.basePath = basePath; + this.rotationUnit = rotationUnit; + this.currentRotationTime = getCurrentRotationTime(); + this.currentFilePath = generateFilePath(); + } + + private LocalDateTime getCurrentRotationTime() { + LocalDateTime now = LocalDateTime.now(); + switch (rotationUnit) { + case HOURS: + return now.truncatedTo(ChronoUnit.HOURS); + case DAYS: + return now.truncatedTo(ChronoUnit.DAYS); + case MINUTES: + return now.truncatedTo(ChronoUnit.MINUTES); + default: + return now.truncatedTo(ChronoUnit.HOURS); + } + } + + private String generateFilePath() { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm"); + return basePath + "_" + currentRotationTime.format(formatter) + ".log"; + } + + private void checkRotation() { + LocalDateTime now = LocalDateTime.now(); + if (currentRotationTime.until(now, rotationUnit) >= 1) { + currentRotationTime = getCurrentRotationTime(); + currentFilePath = generateFilePath(); + } + } + + @Override + public void handle(String message) { + checkRotation(); + + try (Writer writer = new FileWriter(currentFilePath, true)) { + writer.write(message + System.lineSeparator()); + } catch (IOException e) { + System.err.println("Ошибка записи в файл: " + e.getMessage()); + } + } +} \ No newline at end of file diff --git a/task04/src/com/example/task04/Task04Main.java b/task04/src/com/example/task04/Task04Main.java index 55917a30..d7eeb976 100644 --- a/task04/src/com/example/task04/Task04Main.java +++ b/task04/src/com/example/task04/Task04Main.java @@ -1,7 +1,23 @@ package com.example.task04; +import java.time.temporal.ChronoUnit; + public class Task04Main { public static void main(String[] args) { + Logger logger = new Logger("MyLogger", Logger.Level.DEBUG); + + logger.addHandler(new ConsoleHandler()); + logger.addHandler(new FileHandler("application.log")); + logger.addHandler(new RotationFileHandler("rotated", ChronoUnit.HOURS)); + + MemoryHandler memoryHandler = new MemoryHandler(new ConsoleHandler(), 3); + logger.addHandler(memoryHandler); + + logger.debug("Отладочное сообщение"); + logger.info("Информационное сообщение"); + logger.warning("Предупреждение"); + logger.error("Ошибка"); + memoryHandler.flush(); } -} +} \ No newline at end of file