From e279c1a2d11ab6824a775ca74f4e8379b6fb41e4 Mon Sep 17 00:00:00 2001 From: glebobobr Date: Tue, 14 Oct 2025 03:18:06 +0500 Subject: [PATCH 1/4] =?UTF-8?q?=D0=92=D0=BE=D1=80=D0=BE=D0=BD=D0=B8=D0=BD?= =?UTF-8?q?=20=D0=93=D0=BB=D0=B5=D0=B1.=20=D0=97=D0=B0=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=2001?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- task01/src/com/example/task01/Logger.java | 103 ++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 task01/src/com/example/task01/Logger.java diff --git a/task01/src/com/example/task01/Logger.java b/task01/src/com/example/task01/Logger.java new file mode 100644 index 00000000..b185a519 --- /dev/null +++ b/task01/src/com/example/task01/Logger.java @@ -0,0 +1,103 @@ +package com.example.task01; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.Map; + +public class Logger { + private static final Map loggers = new HashMap<>(); + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy.MM.dd"); + private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss"); + + public enum Level { + DEBUG(0), + INFO(1), + WARNING(2), + ERROR(3); + + private final int priority; + + Level(int priority) { + this.priority = priority; + } + + public int getPriority() { + return priority; + } + } + + private final String name; + private Level level = Level.INFO; + + private Logger(String name) { + this.name = name; + } + + public static Logger getLogger(String name) { + return loggers.computeIfAbsent(name, Logger::new); + } + + public String getName() { + return name; + } + + public void setLevel(Level level) { + this.level = level; + } + + public Level getLevel() { + return level; + } + + public void debug(String message) { + log(Level.DEBUG, message); + } + + public void debug(String pattern, Object... args) { + log(Level.DEBUG, pattern, args); + } + + public void info(String message) { + log(Level.INFO, message); + } + + public void info(String pattern, Object... args) { + log(Level.INFO, pattern, args); + } + + public void warning(String message) { + log(Level.WARNING, message); + } + + public void warning(String pattern, Object... args) { + log(Level.WARNING, pattern, args); + } + + public void error(String message) { + log(Level.ERROR, message); + } + + public void error(String pattern, Object... args) { + log(Level.ERROR, pattern, args); + } + + public void log(Level messageLevel, String message) { + if (messageLevel.getPriority() >= level.getPriority()) { + LocalDateTime now = LocalDateTime.now(); + String formattedMessage = String.format("[%s] %s %s %s - %s", + messageLevel, + now.format(DATE_FORMATTER), + now.format(TIME_FORMATTER), + name, + message); + System.out.println(formattedMessage); + } + } + + public void log(Level messageLevel, String pattern, Object... args) { + if (messageLevel.getPriority() >= level.getPriority()) { + log(messageLevel, String.format(pattern, args)); + } + } +} \ No newline at end of file From 0012774d188aa87fced30963bde227850020f014 Mon Sep 17 00:00:00 2001 From: glebobobr Date: Tue, 14 Oct 2025 03:18:13 +0500 Subject: [PATCH 2/4] =?UTF-8?q?=D0=92=D0=BE=D1=80=D0=BE=D0=BD=D0=B8=D0=BD?= =?UTF-8?q?=20=D0=93=D0=BB=D0=B5=D0=B1.=20=D0=97=D0=B0=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=2002?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/com/example/task02/DiscountBill.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 task02/src/com/example/task02/DiscountBill.java diff --git a/task02/src/com/example/task02/DiscountBill.java b/task02/src/com/example/task02/DiscountBill.java new file mode 100644 index 00000000..c7df0439 --- /dev/null +++ b/task02/src/com/example/task02/DiscountBill.java @@ -0,0 +1,32 @@ +package com.example.task02; + +public class DiscountBill extends Bill { + private final int discountPercent; + + public DiscountBill(int discountPercent) { + this.discountPercent = discountPercent; + } + + @Override + public long getPrice() { + long originalPrice = super.getPrice(); + return originalPrice - getDiscountAmount(); + } + + public int getDiscountPercent() { + return discountPercent; + } + + public long getDiscountAmount() { + return (super.getPrice() * discountPercent) / 100; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(super.toString()); + sb.append("\nСкидка: ").append(discountPercent).append("%"); + sb.append("\nРазмер скидки: ").append(getDiscountAmount()); + sb.append("\nИтого со скидкой: ").append(getPrice()); + return sb.toString(); + } +} \ No newline at end of file From 6a919aae1fb9ea95726bafe247e8932d5ecf5848 Mon Sep 17 00:00:00 2001 From: glebobobr Date: Tue, 14 Oct 2025 03:18:19 +0500 Subject: [PATCH 3/4] =?UTF-8?q?=D0=92=D0=BE=D1=80=D0=BE=D0=BD=D0=B8=D0=BD?= =?UTF-8?q?=20=D0=93=D0=BB=D0=B5=D0=B1.=20=D0=97=D0=B0=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=2003?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- task03/src/com/example/task03/Hours.java | 33 ++++++++ .../src/com/example/task03/Milliseconds.java | 11 ++- task03/src/com/example/task03/Minutes.java | 24 ++++-- task03/src/com/example/task03/Seconds.java | 9 +- task03/src/com/example/task03/TimeUnit.java | 9 +- .../src/com/example/task03/TimeUnitUtils.java | 82 ++++++++++++++++++- 6 files changed, 152 insertions(+), 16 deletions(-) create mode 100644 task03/src/com/example/task03/Hours.java diff --git a/task03/src/com/example/task03/Hours.java b/task03/src/com/example/task03/Hours.java new file mode 100644 index 00000000..d29e3ca4 --- /dev/null +++ b/task03/src/com/example/task03/Hours.java @@ -0,0 +1,33 @@ +package com.example.task03; + +/** + * Интервал в часах + */ +public class Hours implements TimeUnit { + + private final long amount; + + public Hours(long amount) { + this.amount = amount; + } + + @Override + public long toMillis() { + return amount * 3600000; + } + + @Override + public long toSeconds() { + return amount * 3600; + } + + @Override + public long toMinutes() { + return amount * 60; + } + + @Override + public long getHours() { + return amount; + } +} \ 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..5e83765a 100644 --- a/task03/src/com/example/task03/Milliseconds.java +++ b/task03/src/com/example/task03/Milliseconds.java @@ -18,11 +18,16 @@ public long toMillis() { @Override public long toSeconds() { - return amount / 1000; + return (amount + 500) / 1000; } @Override public long toMinutes() { - return amount / 1000 * 60; + return (amount + 30000) / 60000; } -} + + @Override + public long getHours() { + return (amount + 1800000) / 3600000; + } +} \ 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..949f53de 100644 --- a/task03/src/com/example/task03/Minutes.java +++ b/task03/src/com/example/task03/Minutes.java @@ -1,27 +1,33 @@ 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 * 60000; } @Override public long toSeconds() { - // TODO: реализовать - throw new UnsupportedOperationException(); + return amount * 60; } @Override public long toMinutes() { - // TODO: реализовать - throw new UnsupportedOperationException(); + return amount; + } + + @Override + public long getHours() { + return (amount + 30) / 60; } -} +} \ 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..2df80ea7 100644 --- a/task03/src/com/example/task03/Seconds.java +++ b/task03/src/com/example/task03/Seconds.java @@ -23,6 +23,11 @@ public long toSeconds() { @Override public long toMinutes() { - return Math.round(amount / 60); + return (amount + 30) / 60; } -} + + @Override + public long getHours() { + return (amount + 1800) / 3600; + } +} \ No newline at end of file diff --git a/task03/src/com/example/task03/TimeUnit.java b/task03/src/com/example/task03/TimeUnit.java index 3b123fb8..2b805a48 100644 --- a/task03/src/com/example/task03/TimeUnit.java +++ b/task03/src/com/example/task03/TimeUnit.java @@ -28,4 +28,11 @@ public interface TimeUnit { */ long toMinutes(); -} + /** + * Возвращает продолжительность текущего интервала, пересчитанного в часах. + * При необходимости округлять по обычным правилам округления (число, меньшее 0.5 переходит в 0, большее или равное - в 1) + * + * @return количество часов в текущем интервале + */ + long getHours(); +} \ 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..46b3ca24 100644 --- a/task03/src/com/example/task03/TimeUnitUtils.java +++ b/task03/src/com/example/task03/TimeUnitUtils.java @@ -24,4 +24,84 @@ public static Milliseconds toMillis(Seconds seconds) { public static Seconds toSeconds(Milliseconds millis) { return new Seconds(millis.toSeconds()); } -} + + /** + * Конвертирует интервал в минутах в интервал в миллисекундах + * + * @param minutes интервал в минутах + * @return интервал в миллисекундах + */ + public static Milliseconds toMillis(Minutes minutes) { + return new Milliseconds(minutes.toMillis()); + } + + /** + * Конвертирует интервал в часах в интервал в миллисекундах + * + * @param hours интервал в часах + * @return интервал в миллисекундах + */ + public static Milliseconds toMillis(Hours hours) { + return new Milliseconds(hours.toMillis()); + } + + /** + * Конвертирует интервал в миллисекундах в интервал в минутах + * + * @param millis интервал в миллисекундах + * @return интервал в минутах + */ + public static Minutes toMinutes(Milliseconds millis) { + return new Minutes(millis.toMinutes()); + } + + /** + * Конвертирует интервал в секундах в интервал в минутах + * + * @param seconds интервал в секундах + * @return интервал в минутах + */ + public static Minutes toMinutes(Seconds seconds) { + return new Minutes(seconds.toMinutes()); + } + + /** + * Конвертирует интервал в часах в интервал в минутах + * + * @param hours интервал в часах + * @return интервал в минутах + */ + public static Minutes toMinutes(Hours hours) { + return new Minutes(hours.toMinutes()); + } + + /** + * Конвертирует интервал в миллисекундах в интервал в часах + * + * @param millis интервал в миллисекундах + * @return интервал в часах + */ + public static Hours toHours(Milliseconds millis) { + return new Hours(millis.getHours()); + } + + /** + * Конвертирует интервал в секундах в интервал в часах + * + * @param seconds интервал в секундах + * @return интервал в часах + */ + public static Hours toHours(Seconds seconds) { + return new Hours(seconds.getHours()); + } + + /** + * Конвертирует интервал в минутах в интервал в часах + * + * @param minutes интервал в минутах + * @return интервал в часах + */ + public static Hours toHours(Minutes minutes) { + return new Hours(minutes.getHours()); + } +} \ No newline at end of file From 16bbb8ed105a7cc71c49082ed7505111fdc3cd85 Mon Sep 17 00:00:00 2001 From: glebobobr Date: Tue, 14 Oct 2025 03:18:25 +0500 Subject: [PATCH 4/4] =?UTF-8?q?=D0=92=D0=BE=D1=80=D0=BE=D0=BD=D0=B8=D0=BD?= =?UTF-8?q?=20=D0=93=D0=BB=D0=B5=D0=B1.=20=D0=97=D0=B0=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=2004?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/example/task04/ConsoleHandler.java | 9 ++ .../src/com/example/task04/FileHandler.java | 35 +++++++ task04/src/com/example/task04/Logger.java | 88 +++++++++++++++++ .../src/com/example/task04/MemoryHandler.java | 52 ++++++++++ .../com/example/task04/MessageHandler.java | 9 ++ .../example/task04/RotatonFileHandler.java | 95 +++++++++++++++++++ 6 files changed, 288 insertions(+) create mode 100644 task04/src/com/example/task04/ConsoleHandler.java create mode 100644 task04/src/com/example/task04/FileHandler.java create mode 100644 task04/src/com/example/task04/Logger.java create mode 100644 task04/src/com/example/task04/MemoryHandler.java create mode 100644 task04/src/com/example/task04/MessageHandler.java create mode 100644 task04/src/com/example/task04/RotatonFileHandler.java diff --git a/task04/src/com/example/task04/ConsoleHandler.java b/task04/src/com/example/task04/ConsoleHandler.java new file mode 100644 index 00000000..25ba0eb4 --- /dev/null +++ b/task04/src/com/example/task04/ConsoleHandler.java @@ -0,0 +1,9 @@ +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..90cc566b --- /dev/null +++ b/task04/src/com/example/task04/FileHandler.java @@ -0,0 +1,35 @@ +package com.example.task04; + +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; + +public class FileHandler implements MessageHandler { + + private final String filename; + private PrintWriter writer; + + public FileHandler(String filename) { + this.filename = filename; + try { + this.writer = new PrintWriter(new FileWriter(filename, true), true); + } catch (IOException e) { + throw new RuntimeException("Не удалось создать файл: " + filename, e); + } + } + + @Override + public void handle(String message) { + if (writer != null) { + writer.println(message); + } + } + + @Override + public void close() { + if (writer != null) { + writer.close(); + writer = null; + } + } +} \ 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..d9ba9245 --- /dev/null +++ b/task04/src/com/example/task04/Logger.java @@ -0,0 +1,88 @@ +package com.example.task04; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.List; + +public class Logger { + + private static final DateTimeFormatter FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + private final String name; + private final List handlers; + private Level level; + + public enum Level { + DEBUG(0), + INFO(1), + WARNING(2), + ERROR(3); + + private final int priority; + + Level(int priority) { + this.priority = priority; + } + + public boolean isEnabled(Level minLevel) { + return this.priority >= minLevel.priority; + } + } + + public Logger(String name) { + this.name = name; + this.handlers = new ArrayList<>(); + this.level = Level.DEBUG; + } + + public void addHandler(MessageHandler handler) { + handlers.add(handler); + } + + public void removeHandler(MessageHandler handler) { + handlers.remove(handler); + } + + public void setLevel(Level level) { + this.level = level; + } + + public void log(Level level, String message) { + if (level.isEnabled(this.level)) { + String formattedMessage = formatMessage(level, 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); + } + + private String formatMessage(Level level, String message) { + String timestamp = LocalDateTime.now().format(FORMATTER); + return String.format("[%s] [%s] [%s] %s", timestamp, name, level, message); + } + + public void close() { + for (MessageHandler handler : handlers) { + handler.close(); + } + handlers.clear(); + } +} \ 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..382fbbf7 --- /dev/null +++ b/task04/src/com/example/task04/MemoryHandler.java @@ -0,0 +1,52 @@ +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<>(bufferSize); + } + + public MemoryHandler(MessageHandler targetHandler) { + this(targetHandler, 100); + } + + @Override + public void handle(String message) { + synchronized (buffer) { + buffer.add(message); + if (buffer.size() >= bufferSize) { + flush(); + } + } + } + + public void flush() { + synchronized (buffer) { + for (String message : buffer) { + targetHandler.handle(message); + } + buffer.clear(); + } + } + + public int getBufferCount() { + synchronized (buffer) { + return buffer.size(); + } + } + + @Override + public void close() { + flush(); + targetHandler.close(); + } +} \ 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..59e27925 --- /dev/null +++ b/task04/src/com/example/task04/MessageHandler.java @@ -0,0 +1,9 @@ +package com.example.task04; + +public interface MessageHandler { + + void handle(String message); + default void close() { + // По умолчанию ничего не делаем + } +} \ No newline at end of file diff --git a/task04/src/com/example/task04/RotatonFileHandler.java b/task04/src/com/example/task04/RotatonFileHandler.java new file mode 100644 index 00000000..1c70e3f7 --- /dev/null +++ b/task04/src/com/example/task04/RotatonFileHandler.java @@ -0,0 +1,95 @@ +package com.example.task04; + +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; +import java.time.temporal.TemporalUnit; + +class RotationFileHandler implements MessageHandler { + + private final String baseFilename; + private final TemporalUnit rotationUnit; + private PrintWriter writer; + private LocalDateTime currentRotationTime; + + public RotationFileHandler(String baseFilename, TemporalUnit rotationUnit) { + this.baseFilename = baseFilename; + this.rotationUnit = rotationUnit; + rotateIfNeeded(); + } + + public RotationFileHandler(String baseFilename) { + this(baseFilename, ChronoUnit.HOURS); + } + + @Override + public void handle(String message) { + rotateIfNeeded(); + if (writer != null) { + writer.println(message); + } + } + + private void rotateIfNeeded() { + LocalDateTime now = LocalDateTime.now(); + + if (currentRotationTime == null || shouldRotate(now)) { + closeCurrentWriter(); + currentRotationTime = truncateTime(now); + openNewWriter(); + } + } + + private boolean shouldRotate(LocalDateTime now) { + LocalDateTime nextRotation = currentRotationTime.plus(1, rotationUnit); + return !now.isBefore(nextRotation); + } + + private LocalDateTime truncateTime(LocalDateTime time) { + if (rotationUnit == ChronoUnit.HOURS) { + return time.truncatedTo(ChronoUnit.HOURS); + } else if (rotationUnit == ChronoUnit.MINUTES) { + return time.truncatedTo(ChronoUnit.MINUTES); + } else if (rotationUnit == ChronoUnit.DAYS) { + return time.truncatedTo(ChronoUnit.DAYS); + } + return time.truncatedTo(ChronoUnit.SECONDS); + } + + private void closeCurrentWriter() { + if (writer != null) { + writer.close(); + writer = null; + } + } + + private void openNewWriter() { + String filename = generateFilename(); + try { + writer = new PrintWriter(new FileWriter(filename, true), true); + } catch (IOException e) { + throw new RuntimeException("Не удалось создать файл: " + filename, e); + } + } + + private String generateFilename() { + String timestamp; + if (rotationUnit == ChronoUnit.HOURS) { + timestamp = currentRotationTime.toString().replace(":", "-").substring(0, 13); + } else if (rotationUnit == ChronoUnit.MINUTES) { + timestamp = currentRotationTime.toString().replace(":", "-").substring(0, 16); + } else if (rotationUnit == ChronoUnit.DAYS) { + timestamp = currentRotationTime.toString().substring(0, 10); + } else { + timestamp = currentRotationTime.toString().replace(":", "-"); + } + return baseFilename + "_" + timestamp + ".log"; + } + + @Override + public void close() { + closeCurrentWriter(); + } +} \ No newline at end of file