From 26f41d8a9715bc11308742fc475a17fcd0b4288a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=AF?= Date: Sun, 19 Oct 2025 19:30:53 +0500 Subject: [PATCH 1/2] =?UTF-8?q?=D1=88=D0=B0=D1=84=D0=B8=D0=BA=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=205?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- task01/src/com/example/task01/Logger.java | 115 ++++++++++++++++++ .../src/com/example/task02/DiscountBill.java | 38 ++++++ task03/src/com/example/task03/Hours.java | 34 ++++++ .../src/com/example/task03/Milliseconds.java | 11 +- task03/src/com/example/task03/Minutes.java | 33 +++-- task03/src/com/example/task03/Seconds.java | 11 +- task03/src/com/example/task03/TimeUnit.java | 1 + .../src/com/example/task03/TimeUnitUtils.java | 35 +++--- .../com/example/task04/ConsoleHandler.java | 10 ++ .../src/com/example/task04/FileHandler.java | 33 +++++ task04/src/com/example/task04/Logger.java | 98 +++++++++++++++ .../src/com/example/task04/MemoryHandler.java | 58 +++++++++ .../com/example/task04/MessageHandler.java | 7 ++ .../example/task04/RotationFileHandler.java | 105 ++++++++++++++++ task04/src/com/example/task04/Task04Main.java | 7 +- 15 files changed, 555 insertions(+), 41 deletions(-) create mode 100644 task01/src/com/example/task01/Logger.java create mode 100644 task02/src/com/example/task02/DiscountBill.java create mode 100644 task03/src/com/example/task03/Hours.java 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/RotationFileHandler.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..80fb3ab5 --- /dev/null +++ b/task01/src/com/example/task01/Logger.java @@ -0,0 +1,115 @@ +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"); + private final String name; + private Level level = Level.INFO; + + public String getName() + { + return name; + } + + public void setLevel(Level level) + { + this.level = level; + } + + private Logger(String name) + { + this.name = name; + } + + public static Logger getLogger(String name) + { + return loggers.computeIfAbsent(name, Logger::new); + } + + 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; + } + } + + 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)); + } +} diff --git a/task02/src/com/example/task02/DiscountBill.java b/task02/src/com/example/task02/DiscountBill.java new file mode 100644 index 00000000..1da0c679 --- /dev/null +++ b/task02/src/com/example/task02/DiscountBill.java @@ -0,0 +1,38 @@ +package com.example.task02; + +public class DiscountBill extends Bill +{ + private final int discountPercent; + + public int getDiscountPercent() + { + return discountPercent; + } + + public DiscountBill(int discountPercent) + { + this.discountPercent = discountPercent; + } + + @Override + public long getPrice() + { + long originalPrice = super.getPrice(); + return originalPrice - getDiscountAmount(); + } + + 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(); + } +} diff --git a/task03/src/com/example/task03/Hours.java b/task03/src/com/example/task03/Hours.java new file mode 100644 index 00000000..2e9aea47 --- /dev/null +++ b/task03/src/com/example/task03/Hours.java @@ -0,0 +1,34 @@ +package com.example.task03; + +public class Hours implements TimeUnit +{ + private final long amount; + + @Override + public long getHours() + { + return 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; + } +} diff --git a/task03/src/com/example/task03/Milliseconds.java b/task03/src/com/example/task03/Milliseconds.java index 5115bc7d..d0677dd4 100644 --- a/task03/src/com/example/task03/Milliseconds.java +++ b/task03/src/com/example/task03/Milliseconds.java @@ -3,7 +3,8 @@ /** * Интервал в миллисекундах */ -public class Milliseconds implements TimeUnit { +public class Milliseconds implements TimeUnit +{ private final long amount; @@ -18,11 +19,15 @@ 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; } + + public long getHours() { + return (amount + 1800000) / 3600000; +} } diff --git a/task03/src/com/example/task03/Minutes.java b/task03/src/com/example/task03/Minutes.java index d6fa0594..01f522ea 100644 --- a/task03/src/com/example/task03/Minutes.java +++ b/task03/src/com/example/task03/Minutes.java @@ -1,27 +1,34 @@ package com.example.task03; -public class Minutes implements TimeUnit { +public class Minutes implements TimeUnit +{ + private final long amount; - public Minutes(long amount) { - // TODO: реализовать - throw new UnsupportedOperationException(); + public Minutes(long amount) + { + this.amount = amount; } @Override - public long toMillis() { - // TODO: реализовать - throw new UnsupportedOperationException(); + public long toMillis() + { + return amount * 60000; } @Override - public long toSeconds() { - // TODO: реализовать - throw new UnsupportedOperationException(); + public long toSeconds() + { + return amount * 60; } @Override - public long toMinutes() { - // TODO: реализовать - throw new UnsupportedOperationException(); + public long toMinutes() + { + return amount; + } + + public long getHours() + { + return (amount + 30) / 60; } } diff --git a/task03/src/com/example/task03/Seconds.java b/task03/src/com/example/task03/Seconds.java index ce6bc213..ed9d685c 100644 --- a/task03/src/com/example/task03/Seconds.java +++ b/task03/src/com/example/task03/Seconds.java @@ -3,7 +3,8 @@ /** * Интервал в секундах */ -public class Seconds implements TimeUnit { +public class Seconds implements TimeUnit +{ private final long amount; @@ -22,7 +23,11 @@ public long toSeconds() { } @Override - public long toMinutes() { - return Math.round(amount / 60); + public long toMinutes() {return (amount + 30) / 60;} + + @Override + public long getHours() + { + return (amount + 1800) / 3600; } } diff --git a/task03/src/com/example/task03/TimeUnit.java b/task03/src/com/example/task03/TimeUnit.java index 3b123fb8..ba6f7d34 100644 --- a/task03/src/com/example/task03/TimeUnit.java +++ b/task03/src/com/example/task03/TimeUnit.java @@ -27,5 +27,6 @@ public interface TimeUnit { * @return количество минут в текущем интервале */ long toMinutes(); + long getHours(); } diff --git a/task03/src/com/example/task03/TimeUnitUtils.java b/task03/src/com/example/task03/TimeUnitUtils.java index 790f8850..ed74e29d 100644 --- a/task03/src/com/example/task03/TimeUnitUtils.java +++ b/task03/src/com/example/task03/TimeUnitUtils.java @@ -3,25 +3,22 @@ /** * Класс, в котором собраны методы для работы с {@link TimeUnit} */ -public class TimeUnitUtils { +public class TimeUnitUtils +{ - /** - * Конвертирует интервал в секундах в интервал в миллисекундах - * - * @param seconds интервал в секундах - * @return интервал в миллисекундах - */ - public static Milliseconds toMillis(Seconds seconds) { - return new Milliseconds(seconds.toMillis()); - } + public static Milliseconds toMillis(Seconds seconds) {return new Milliseconds(seconds.toMillis());} + public static Milliseconds toMillis(Minutes minutes) { return new Milliseconds(minutes.toMillis());} + public static Milliseconds toMillis(Hours hours) { return new Milliseconds(hours.toMillis());} - /** - * Конвертирует интервал в миллисекундах в интервал в секундах - * - * @param millis интервал в миллисекундах - * @return интервал в секундах - */ - public static Seconds toSeconds(Milliseconds millis) { - return new Seconds(millis.toSeconds()); - } + public static Seconds toSeconds(Milliseconds millis) {return new Seconds(millis.toSeconds());} + public static Seconds toSeconds(Minutes minutes) {return new Seconds(minutes.toSeconds());} + public static Seconds toSeconds(Hours hours) {return new Seconds(hours.toSeconds());} + + public static Minutes toMinutes(Milliseconds millis) { return new Minutes(millis.toMinutes());} + public static Minutes toSeconds(Seconds seconds) { return new Minutes(seconds.toMinutes());} + public static Minutes toHours(Hours hours) { return new Minutes(hours.toMinutes());} + + public static Hours toHours(Milliseconds millis) { return new Hours(millis.toMinutes());} + public static Hours toHours(Seconds seconds) { return new Hours(seconds.toMinutes());} + public static Hours toHours(Minutes minutes) { return new Hours(minutes.toMinutes());} } diff --git a/task04/src/com/example/task04/ConsoleHandler.java b/task04/src/com/example/task04/ConsoleHandler.java new file mode 100644 index 00000000..aac7d49c --- /dev/null +++ b/task04/src/com/example/task04/ConsoleHandler.java @@ -0,0 +1,10 @@ +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..958e9379 --- /dev/null +++ b/task04/src/com/example/task04/FileHandler.java @@ -0,0 +1,33 @@ +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) throws IOException + { + this.filename = filename; + this.writer = new PrintWriter(new FileWriter(filename, true), true); + } + + @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..2ac9e2e4 --- /dev/null +++ b/task04/src/com/example/task04/Logger.java @@ -0,0 +1,98 @@ +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 Logger(String name) + { + this.name = name; + this.handlers = new ArrayList<>(); + this.level = Level.DEBUG; + } + + 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 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..6979fc82 --- /dev/null +++ b/task04/src/com/example/task04/MemoryHandler.java @@ -0,0 +1,58 @@ +package com.example.task04; + +import java.util.ArrayList; +import java.util.List; + +public class MemoryHandler implements MessageHandler +{ + + private final MessageHandler otherHandler; + private final int bufferSize; + private final List buffer; + + public int getBufferCount() + { + synchronized (buffer) + { + return buffer.size(); + } + } + + public MemoryHandler(MessageHandler targetHandler, int bufferSize) + { + this.otherHandler = 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) otherHandler.handle(message); + buffer.clear(); + } + } + + @Override + public void close() + { + flush(); + otherHandler.close(); + } +} diff --git a/task04/src/com/example/task04/MessageHandler.java b/task04/src/com/example/task04/MessageHandler.java new file mode 100644 index 00000000..0e75a70a --- /dev/null +++ b/task04/src/com/example/task04/MessageHandler.java @@ -0,0 +1,7 @@ +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/RotationFileHandler.java b/task04/src/com/example/task04/RotationFileHandler.java new file mode 100644 index 00000000..3dbf29f3 --- /dev/null +++ b/task04/src/com/example/task04/RotationFileHandler.java @@ -0,0 +1,105 @@ +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 || doRotate(now)) + { + closeCurrentWriter(); + currentRotationTime = truncateTime(now); + openNewWriter(); + } + } + + private boolean doRotate(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 diff --git a/task04/src/com/example/task04/Task04Main.java b/task04/src/com/example/task04/Task04Main.java index 55917a30..9639e265 100644 --- a/task04/src/com/example/task04/Task04Main.java +++ b/task04/src/com/example/task04/Task04Main.java @@ -1,7 +1,8 @@ package com.example.task04; -public class Task04Main { - public static void main(String[] args) { - +public class Task04Main +{ + public static void main(String[] args) + { } } From 16f4aae4d424e4d7581ad78d90ebfe0103689960 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=AF?= Date: Sun, 19 Oct 2025 19:40:33 +0500 Subject: [PATCH 2/2] =?UTF-8?q?=D1=88=D0=B0=D1=84=D0=B8=D0=BA=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=205?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- task01/src/com/example/task01/Logger.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/task01/src/com/example/task01/Logger.java b/task01/src/com/example/task01/Logger.java index 80fb3ab5..d59c186b 100644 --- a/task01/src/com/example/task01/Logger.java +++ b/task01/src/com/example/task01/Logger.java @@ -21,7 +21,10 @@ public void setLevel(Level level) { this.level = level; } - + public Level getLevel() + { + return level; + } private Logger(String name) { this.name = name;