From 76f5232459c0338cab85d28dc26da74126c097ad Mon Sep 17 00:00:00 2001 From: Max Razin Date: Thu, 13 Mar 2025 22:54:41 +0500 Subject: [PATCH 1/4] Task01 complete --- task01/src/com/example/task01/Logger.java | 100 ++++++++++++++++++ task01/src/com/example/task01/Task01Main.java | 19 +++- 2 files changed, 118 insertions(+), 1 deletion(-) 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..9e8e2897 --- /dev/null +++ b/task01/src/com/example/task01/Logger.java @@ -0,0 +1,100 @@ +package com.example.task01; + +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.time.LocalDateTime; + +public class Logger { + private static final ArrayList loggers = new ArrayList<>(); + private final String name; + private LogLevel level; + + public enum LogLevel { + DEBUG, + INFO, + WARNING, + ERROR + } + + public Logger(String name) { + this.name = name; + this.level = LogLevel.DEBUG; + loggers.add(this); + } + + public static Logger getLogger(String name) { + for (Logger logger : loggers) { + if (logger.getName().equals(name)) { + return logger; + } + } + Logger newLogger = new Logger(name); + loggers.add(newLogger); + return newLogger; + } + + public String getName(){ + return name; + } + + public LogLevel getLevel(){ + return level; + } + + public void setLevel(LogLevel level) { + this.level = level; + } + + public void debug(String message) { + log(LogLevel.DEBUG, message); + } + + public void debug(String format, Object... args) { + log(LogLevel.DEBUG, format, args); + } + + public void info(String message) { + log(LogLevel.INFO, message); + } + + public void info(String format, Object... args) { + log(LogLevel.INFO, format, args); + } + + public void warning(String message) { + log(LogLevel.WARNING, message); + } + + public void warning(String format, Object... args) { + log(LogLevel.WARNING, format, args); + } + + public void error(String message) { + log(LogLevel.ERROR, message); + } + + public void error(String format, Object... args) { + log(LogLevel.ERROR, format, args); + } + + public void log(LogLevel level, String message) { + if (level.ordinal() >= this.level.ordinal()) { + String formattedMessage = formatMessage(level, message); + System.out.println(formattedMessage); + } + } + + public void log(LogLevel level, String format, Object... args) { + if (level.ordinal() >= this.level.ordinal()) { + String formattedMessage = formatMessage(level, String.format(format, args)); + System.out.println(formattedMessage); + } + } + + private String formatMessage(LogLevel level, String message) { + LocalDateTime now = LocalDateTime.now(); + String date = now.format(DateTimeFormatter.ofPattern("yyyy.MM.dd")); + String time = now.format(DateTimeFormatter.ofPattern("HH:mm:ss")); + return String.format("[%s] %s %s %s - %s", level, date, time, name, message); + } +} diff --git a/task01/src/com/example/task01/Task01Main.java b/task01/src/com/example/task01/Task01Main.java index 9973557d..6178149a 100644 --- a/task01/src/com/example/task01/Task01Main.java +++ b/task01/src/com/example/task01/Task01Main.java @@ -2,6 +2,23 @@ public class Task01Main { public static void main(String[] args) { + Logger logger1 = Logger.getLogger("TestLogger"); + Logger logger2 = Logger.getLogger("TestLogger"); + System.out.println("logger1 == logger2: " + (logger1 == logger2)); + + logger1.debug("Debug message"); + logger1.info("Info message"); + logger1.warning("Warning message"); + logger1.error("Error message"); + + logger1.setLevel(Logger.LogLevel.WARNING); + + logger1.debug("This debug message should not be printed"); + logger1.info("This info message should not be printed"); + logger1.warning("This warning message should be printed"); + logger1.error("This error message should be printed"); + + logger1.error("Formatted error: %d + %d = %d", 2, 3, 5); } -} +} \ No newline at end of file From 1721566a05419e2c102d45c98896c13bfc00ff76 Mon Sep 17 00:00:00 2001 From: Max Razin Date: Thu, 13 Mar 2025 23:25:46 +0500 Subject: [PATCH 2/4] Task02 complete --- .../src/com/example/task02/DiscountBill.java | 22 +++++++++++++++++++ task02/src/com/example/task02/Task02Main.java | 15 +++++++------ 2 files changed, 30 insertions(+), 7 deletions(-) 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..8666393f --- /dev/null +++ b/task02/src/com/example/task02/DiscountBill.java @@ -0,0 +1,22 @@ +package com.example.task02; + +public class DiscountBill extends Bill{ + private final int discount; + + public DiscountBill(int discount) { + this.discount = discount; + } + + public int getDiscount() { + return discount; + } + + @Override + public long getPrice() { + return (long)(super.getPrice() - super.getPrice() * (discount / 100.0)); + } + + public long getAbsoluteDiscountAmount (){ + return super.getPrice() - getPrice(); + } +} diff --git a/task02/src/com/example/task02/Task02Main.java b/task02/src/com/example/task02/Task02Main.java index e589f2d3..82b537e3 100644 --- a/task02/src/com/example/task02/Task02Main.java +++ b/task02/src/com/example/task02/Task02Main.java @@ -10,12 +10,13 @@ public class Task02Main { private static final Item ITEM6 = new Item("Товар 6", 60); public static void main(String[] args) { - Bill bill = new Bill(); - bill.add(ITEM1, 10); - bill.add(ITEM3, 3); - bill.add(ITEM6, 1); - System.out.println(bill); - bill.add(ITEM3, 3); - System.out.println(bill); + DiscountBill discountBill = new DiscountBill(20); // Скидка 10% + discountBill.add(ITEM2,24 ); + discountBill.add(ITEM5, 12); + discountBill.add(ITEM6, 10); + System.out.println(discountBill); + + System.out.println("Размер скидки: " + discountBill.getDiscount() + "%"); + System.out.println("Абсолютное значение скидки: " + discountBill.getAbsoluteDiscountAmount()); } } From c793f7badabd5fae0cd9209fbd1145cbe382b448 Mon Sep 17 00:00:00 2001 From: Max Razin Date: Fri, 14 Mar 2025 11:37:12 +0500 Subject: [PATCH 3/4] Task03 complete --- task03/src/com/example/task03/Hours.java | 29 ++++++++++++++ .../src/com/example/task03/Milliseconds.java | 10 ++++- task03/src/com/example/task03/Minutes.java | 18 +++++---- task03/src/com/example/task03/Seconds.java | 7 +++- task03/src/com/example/task03/Task03Main.java | 1 + task03/src/com/example/task03/TimeUnit.java | 7 ++++ .../src/com/example/task03/TimeUnitUtils.java | 40 +++++++++++++++++++ 7 files changed, 101 insertions(+), 11 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..041ed57d --- /dev/null +++ b/task03/src/com/example/task03/Hours.java @@ -0,0 +1,29 @@ +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 toHours() { + return amount; + } +} diff --git a/task03/src/com/example/task03/Milliseconds.java b/task03/src/com/example/task03/Milliseconds.java index 5115bc7d..41a72a0c 100644 --- a/task03/src/com/example/task03/Milliseconds.java +++ b/task03/src/com/example/task03/Milliseconds.java @@ -18,11 +18,17 @@ public long toMillis() { @Override public long toSeconds() { - return amount / 1000; + return Math.round(amount / 1000f); } @Override public long toMinutes() { - return amount / 1000 * 60; + return Math.round(amount / (1000 * 60f)); } + + @Override + public long toHours(){ + return Math.round(amount / (1000 * 3600f)); + } + } diff --git a/task03/src/com/example/task03/Minutes.java b/task03/src/com/example/task03/Minutes.java index d6fa0594..9fa11fc2 100644 --- a/task03/src/com/example/task03/Minutes.java +++ b/task03/src/com/example/task03/Minutes.java @@ -1,27 +1,29 @@ 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 toHours(){ + return Math.round(amount / 60f); } } diff --git a/task03/src/com/example/task03/Seconds.java b/task03/src/com/example/task03/Seconds.java index ce6bc213..388de81e 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 Math.round(amount / 60f); + } + + @Override + public long toHours(){ + return Math.round(amount / 3600f); } } diff --git a/task03/src/com/example/task03/Task03Main.java b/task03/src/com/example/task03/Task03Main.java index ff0f14b0..ef971c9c 100644 --- a/task03/src/com/example/task03/Task03Main.java +++ b/task03/src/com/example/task03/Task03Main.java @@ -10,5 +10,6 @@ private static void printTimeUnit(TimeUnit unit) { System.out.println(String.format("Milliseconds: %d", unit.toMillis())); System.out.println(String.format("Seconds: %d", unit.toSeconds())); System.out.println(String.format("Minutes: %d", unit.toMinutes())); + System.out.println(String.format("Hours: %d", unit.toHours())); } } diff --git a/task03/src/com/example/task03/TimeUnit.java b/task03/src/com/example/task03/TimeUnit.java index 3b123fb8..bf03dcd8 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 toHours(); } diff --git a/task03/src/com/example/task03/TimeUnitUtils.java b/task03/src/com/example/task03/TimeUnitUtils.java index 790f8850..737b018b 100644 --- a/task03/src/com/example/task03/TimeUnitUtils.java +++ b/task03/src/com/example/task03/TimeUnitUtils.java @@ -15,6 +15,14 @@ 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()); + } + /** * Конвертирует интервал в миллисекундах в интервал в секундах * @@ -24,4 +32,36 @@ public static Milliseconds toMillis(Seconds seconds) { 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 toMinutes(Seconds seconds) { + return new Minutes(seconds.toMinutes()); + } + + public static Minutes toMinutes(Hours hours) { + return new Minutes(hours.toMinutes()); + } + + public static Hours toHours(Milliseconds millis) { + return new Hours(millis.toHours()); + } + + public static Hours toHours(Seconds seconds) { + return new Hours(seconds.toHours()); + } + + public static Hours toHours(Minutes minutes) { + return new Hours(minutes.toHours()); + } } From 71972d4a0e0de13ea6196a8fa7f83a4332e6ab54 Mon Sep 17 00:00:00 2001 From: Max Razin Date: Fri, 14 Mar 2025 12:13:40 +0500 Subject: [PATCH 4/4] Task04 complete --- .../com/example/task04/ConsoleHandler.java | 8 ++ .../src/com/example/task04/FileHandler.java | 21 ++++ task04/src/com/example/task04/Logger.java | 109 ++++++++++++++++++ .../src/com/example/task04/MemoryHandler.java | 31 +++++ .../com/example/task04/MessageHandler.java | 5 + .../example/task04/RotationFileHandler.java | 39 +++++++ 6 files changed, 213 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/RotationFileHandler.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..89746f32 --- /dev/null +++ b/task04/src/com/example/task04/ConsoleHandler.java @@ -0,0 +1,8 @@ +package com.example.task04; + +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..cfd51c3b --- /dev/null +++ b/task04/src/com/example/task04/FileHandler.java @@ -0,0 +1,21 @@ +package com.example.task04; + +import java.io.FileWriter; +import java.io.IOException; + +public class FileHandler implements MessageHandler { + private final String fileName; + + public FileHandler(String filePath) { + this.fileName = filePath; + } + + @Override + public void handle(String message) { + try (FileWriter writer = new FileWriter(fileName, true)) { + writer.write(message + '\n'); + } catch (IOException ex) { + System.out.println(ex.getMessage()); + } + } +} diff --git a/task04/src/com/example/task04/Logger.java b/task04/src/com/example/task04/Logger.java new file mode 100644 index 00000000..b9008a07 --- /dev/null +++ b/task04/src/com/example/task04/Logger.java @@ -0,0 +1,109 @@ +package com.example.task04; + +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.time.LocalDateTime; + +public class Logger { + private static final ArrayList loggers = new ArrayList<>(); + private final ArrayList handlers = new ArrayList<>(); + private final String name; + private LogLevel level; + + public enum LogLevel { + DEBUG, + INFO, + WARNING, + ERROR + } + + public Logger(String name) { + this.name = name; + this.level = LogLevel.DEBUG; + loggers.add(this); + } + + public static Logger getLogger(String name) { + for (Logger logger : loggers) { + if (logger.getName().equals(name)) { + return logger; + } + } + Logger newLogger = new Logger(name); + loggers.add(newLogger); + return newLogger; + } + + public void addHandler(MessageHandler handler) { + handlers.add(handler); + } + + public String getName(){ + return name; + } + + public LogLevel getLevel(){ + return level; + } + + public void setLevel(LogLevel level) { + this.level = level; + } + + public void debug(String message) { + log(LogLevel.DEBUG, message); + } + + public void debug(String format, Object... args) { + log(LogLevel.DEBUG, format, args); + } + + public void info(String message) { + log(LogLevel.INFO, message); + } + + public void info(String format, Object... args) { + log(LogLevel.INFO, format, args); + } + + public void warning(String message) { + log(LogLevel.WARNING, message); + } + + public void warning(String format, Object... args) { + log(LogLevel.WARNING, format, args); + } + + public void error(String message) { + log(LogLevel.ERROR, message); + } + + public void error(String format, Object... args) { + log(LogLevel.ERROR, format, args); + } + + public void log(LogLevel level, String message) { + if (level.ordinal() >= this.level.ordinal()) { + String formattedMessage = formatMessage(level, message); + for (MessageHandler handler : handlers) { + handler.handle(formattedMessage); + } + } + } + + public void log(LogLevel level, String format, Object... args) { + if (level.ordinal() >= this.level.ordinal()) { + String formattedMessage = formatMessage(level, String.format(format, args)); + for (MessageHandler handler : handlers) { + handler.handle(formattedMessage); + } + } + } + + private String formatMessage(LogLevel level, String message) { + LocalDateTime now = LocalDateTime.now(); + String date = now.format(DateTimeFormatter.ofPattern("yyyy.MM.dd")); + String time = now.format(DateTimeFormatter.ofPattern("HH:mm:ss")); + return String.format("[%s] %s %s %s - %s", level, date, time, name, message); + } +} diff --git a/task04/src/com/example/task04/MemoryHandler.java b/task04/src/com/example/task04/MemoryHandler.java new file mode 100644 index 00000000..c0ad6544 --- /dev/null +++ b/task04/src/com/example/task04/MemoryHandler.java @@ -0,0 +1,31 @@ +package com.example.task04; + +import java.util.ArrayList; + +public class MemoryHandler implements MessageHandler { + + private final ArrayList buffer = new ArrayList<>(); + private final int bufferLimit; + private final MessageHandler handler; + + public MemoryHandler(int bufferLimit, MessageHandler handler) { + this.bufferLimit = bufferLimit; + this.handler = handler; + } + + @Override + public void handle(String message) { + buffer.add(message); + + if (buffer.size() >= bufferLimit) { + send(); + } + } + + public void send() { + for (String message : buffer) { + handler.handle(message); + } + buffer.clear(); + } +} diff --git a/task04/src/com/example/task04/MessageHandler.java b/task04/src/com/example/task04/MessageHandler.java new file mode 100644 index 00000000..d0649a7c --- /dev/null +++ b/task04/src/com/example/task04/MessageHandler.java @@ -0,0 +1,5 @@ +package com.example.task04; + +public interface MessageHandler { + 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..9e7d99a6 --- /dev/null +++ b/task04/src/com/example/task04/RotationFileHandler.java @@ -0,0 +1,39 @@ +package com.example.task04; + +import java.io.FileWriter; +import java.io.IOException; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; + +public class RotationFileHandler implements MessageHandler { + + private String fileName; + private final ChronoUnit rotation; + private LocalDateTime lastRotation; + + public RotationFileHandler(ChronoUnit rotation) { + this.rotation = rotation; + this.lastRotation = LocalDateTime.now(); + rotateFile(); + } + + private void rotateFile() { + String time = lastRotation.format(DateTimeFormatter.ofPattern("yyyy-MM-dd-HH")); + this.fileName = time + ".txt"; + } + + @Override + public void handle(String message) { + if (LocalDateTime.now().isAfter(lastRotation.plus(1, rotation))) { + lastRotation = LocalDateTime.now(); + rotateFile(); + } + + try (FileWriter writer = new FileWriter(fileName, true)) { + writer.write(message + '\n'); + } catch (IOException ex) { + System.out.println(ex.getMessage()); + } + } +} \ No newline at end of file