From a9c06ef004ed2ef5dfe7209ee129ba70714933f5 Mon Sep 17 00:00:00 2001 From: lenadekart Date: Fri, 14 Mar 2025 20:29:56 +0500 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=B8=D0=BC=D0=BE=D0=BD=D0=B5=D0=BD?= =?UTF-8?q?=D0=BA=D0=BE=20=D0=9B=D0=B5=D0=BE=D0=BD=D0=B8=D0=B4.=20=D0=97?= =?UTF-8?q?=D0=B0=D0=B4=D0=B0=D1=87=D0=B8=205.1=20-=205.4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- task01/src/com/example/task01/Level.java | 8 ++ task01/src/com/example/task01/Logger.java | 69 ++++++++++++ task02/src/com/example/task02/Bill.java | 2 +- .../src/com/example/task02/DiscountBill.java | 20 ++++ task02/src/com/example/task02/Item.java | 2 +- task02/src/com/example/task02/Task02Main.java | 23 ++-- task03/src/com/example/task03/Hours.java | 30 ++++++ .../src/com/example/task03/Milliseconds.java | 11 +- task03/src/com/example/task03/Minutes.java | 21 ++-- task03/src/com/example/task03/Seconds.java | 8 +- task03/src/com/example/task03/Task03Main.java | 1 + task03/src/com/example/task03/TimeUnit.java | 7 ++ .../src/com/example/task03/TimeUnitUtils.java | 42 +++++++- .../com/example/task04/ConsoleHandler.java | 8 ++ .../src/com/example/task04/FileHandler.java | 15 +++ task04/src/com/example/task04/Level.java | 8 ++ task04/src/com/example/task04/Logger.java | 100 ++++++++++++++++++ .../src/com/example/task04/MemoryHandler.java | 27 +++++ .../com/example/task04/MessageHandler.java | 5 + .../example/task04/RotationFileHandler.java | 31 ++++++ task04/src/com/example/task04/Task04Main.java | 17 ++- 21 files changed, 426 insertions(+), 29 deletions(-) create mode 100644 task01/src/com/example/task01/Level.java 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/Level.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/Level.java b/task01/src/com/example/task01/Level.java new file mode 100644 index 00000000..716af2d8 --- /dev/null +++ b/task01/src/com/example/task01/Level.java @@ -0,0 +1,8 @@ +package com.example.task01; + +public enum Level { + INFO, + DEBUG, + 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..b4350825 --- /dev/null +++ b/task01/src/com/example/task01/Logger.java @@ -0,0 +1,69 @@ +package com.example.task01; +import java.util.HashMap; +import java.util.Map; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class Logger { + private final String name; + private Level level = Level.INFO; + private static final Map loggers = new HashMap<>(); + + public Logger(String name) { + this.name = name; + loggers.put(name,this); + } + public String getName(){ + return name; + } + + public static Logger getLogger(String name){ + if (!loggers.containsKey(name)) + throw new IllegalArgumentException("There is no logger with that name"); + return loggers.get(name); + } + public void setLevel(Level level){ + this.level = level; + } + public Level getLevel(){ + return level; + } + + public void info(String message){ + log(Level.INFO, message); + } + public void info(String format, Object... args){ + log(Level.INFO, 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 error(String message){ + log(Level.ERROR, message); + } + public void error(String format, Object... args){ + log(Level.ERROR, 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 log(Level level, String message){ + if (this.level == level){ + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd"); + SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss"); + String date = dateFormat.format(new Date()); + String time = timeFormat.format(new Date()); + System.out.println(String.format("[%s] %s %s %s - %s", level, date, time, name, message));; + } + } + + public void log(Level level, String format, Object... args) { + log(level, String.format(format, args)); + } +} \ No newline at end of file diff --git a/task02/src/com/example/task02/Bill.java b/task02/src/com/example/task02/Bill.java index 91db2336..bfe62b07 100644 --- a/task02/src/com/example/task02/Bill.java +++ b/task02/src/com/example/task02/Bill.java @@ -62,4 +62,4 @@ private static class BillItem { this.amount = amount; } } -} +} \ 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..f8639001 --- /dev/null +++ b/task02/src/com/example/task02/DiscountBill.java @@ -0,0 +1,20 @@ +package com.example.task02; + +public class DiscountBill extends Bill +{ + private final double discount; + public DiscountBill(double discount){ + this.discount = discount; + } + public double getDiscount() { + return discount; + } + public double getDiscountAmount() { + return super.getPrice() * discount / 100; + } + + @Override + public long getPrice() { + return Math.round(super.getPrice() * (100 - discount) / 100.0); + } +} \ No newline at end of file diff --git a/task02/src/com/example/task02/Item.java b/task02/src/com/example/task02/Item.java index 6f8a4c23..5915830e 100644 --- a/task02/src/com/example/task02/Item.java +++ b/task02/src/com/example/task02/Item.java @@ -25,4 +25,4 @@ public long getPrice() { public String toString() { return String.format("[%s:%d]", name, price); } -} +} \ No newline at end of file diff --git a/task02/src/com/example/task02/Task02Main.java b/task02/src/com/example/task02/Task02Main.java index e589f2d3..49ba7fca 100644 --- a/task02/src/com/example/task02/Task02Main.java +++ b/task02/src/com/example/task02/Task02Main.java @@ -1,21 +1,24 @@ package com.example.task02; public class Task02Main { - private static final Item ITEM1 = new Item("Товар 1", 10); private static final Item ITEM2 = new Item("Товар 2", 20); private static final Item ITEM3 = new Item("Товар 3", 30); - private static final Item ITEM4 = new Item("Товар 4", 40); - private static final Item ITEM5 = new Item("Товар 5", 50); - 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); + bill.add(ITEM2, 5); + bill.add(ITEM3, 2); + System.out.println("Базовый счет:\n\n" + bill); + + DiscountBill discountBill = new DiscountBill(10); + discountBill.add(ITEM1, 10); + discountBill.add(ITEM2, 5); + discountBill.add(ITEM3, 2); + System.out.println("\nСчет со скидкой:\n" + discountBill); + System.out.println("\nРазмер скидки: " + discountBill.getDiscount() + "%"); + System.out.println("Абсолютное значение скидки: " + discountBill.getDiscountAmount()); + System.out.println("Итоговая стоимость: " + discountBill.getPrice()); } -} +} \ No newline at end of file diff --git a/task03/src/com/example/task03/Hours.java b/task03/src/com/example/task03/Hours.java new file mode 100644 index 00000000..07108b68 --- /dev/null +++ b/task03/src/com/example/task03/Hours.java @@ -0,0 +1,30 @@ +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 * 3600 * 1000; + } + + @Override + public long toSeconds() { + return amount * 3600; + } + + @Override + public long toMinutes() { + return amount * 60; + } + + @Override + public long toHours() { + 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..a17389e2 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 Math.round(amount / 1000f); } @Override public long toMinutes() { - return amount / 1000 * 60; + return Math.round(amount / 1000 / 60f); } -} + + @Override + public long toHours() { + return this.amount / 3600 / 1000 ; + } +} \ 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..cf2e75c5 100644 --- a/task03/src/com/example/task03/Minutes.java +++ b/task03/src/com/example/task03/Minutes.java @@ -1,27 +1,28 @@ 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; + } + + @Override + public long toHours() { + return Math.round(amount / 60f); } -} +} \ 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..44c73a32 100644 --- a/task03/src/com/example/task03/Seconds.java +++ b/task03/src/com/example/task03/Seconds.java @@ -23,6 +23,10 @@ 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); + } +} \ No newline at end of file diff --git a/task03/src/com/example/task03/Task03Main.java b/task03/src/com/example/task03/Task03Main.java index ff0f14b0..e3e25743 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..d5afbbe0 100644 --- a/task03/src/com/example/task03/TimeUnitUtils.java +++ b/task03/src/com/example/task03/TimeUnitUtils.java @@ -21,7 +21,47 @@ public static Milliseconds toMillis(Seconds seconds) { * @param millis интервал в миллисекундах * @return интервал в секундах */ + public static Milliseconds toMillis(Minutes minutes) { + return new Milliseconds(minutes.toMillis()); + } + + public static Milliseconds toMillis(Hours hours) { + return new Milliseconds(hours.toMillis()); + } + 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 milliseconds){ + return new Minutes(milliseconds.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 milliseconds){ + return new Hours(milliseconds.toHours()); + } + + public static Hours toHours(Seconds seconds){ + return new Hours(seconds.toHours()); + } + + public static Hours toHours(Minutes minutes){ + return new Hours(minutes.toHours()); + } +} \ 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..b671c7bf --- /dev/null +++ b/task04/src/com/example/task04/ConsoleHandler.java @@ -0,0 +1,8 @@ +package com.example.task04; + +public class ConsoleHandler implements MessageHandler{ + @Override + public void log(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..f3cf9448 --- /dev/null +++ b/task04/src/com/example/task04/FileHandler.java @@ -0,0 +1,15 @@ +package com.example.task04; + +import java.io.FileWriter; +import java.io.IOException; + +public class FileHandler implements MessageHandler { + @Override + public void log(String message) { + try (FileWriter writer = new FileWriter("log.txt", true)) { + writer.write(message + "\n"); + } catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/task04/src/com/example/task04/Level.java b/task04/src/com/example/task04/Level.java new file mode 100644 index 00000000..8e31fd7d --- /dev/null +++ b/task04/src/com/example/task04/Level.java @@ -0,0 +1,8 @@ +package com.example.task04; + +public enum Level { + DEBUG, + INFO, + WARNING, + ERROR +} \ 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..2b4f2073 --- /dev/null +++ b/task04/src/com/example/task04/Logger.java @@ -0,0 +1,100 @@ +package com.example.task04; + +import java.text.MessageFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +public class Logger { + + private static final Map loggers = new HashMap<>(); + private static ArrayList handlers = new ArrayList<>(); + + private final String name; + private Level level = Level.INFO; + + public Logger(String name) { + this.name = name; + handlers.add(new ConsoleHandler()); + loggers.put(this.name, this); + } + + public Logger(String name, ArrayList messageHandlers) { + this.name = name; + handlers = messageHandlers; + loggers.put(this.name, this); + } + + public Logger(String name, Level level, ArrayList messageHandlers) { + this.name = name; + this.level = level; + handlers = messageHandlers; + loggers.put(this.name, this); + } + + public static Logger getLogger(String name) { + if (!loggers.containsKey(name)) { + loggers.put(name, new Logger(name)); + } + return loggers.get(name); + } + + 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 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); + } + + private void log(Level level, String message) { + if(this.level.ordinal() <= level.ordinal()) { + String date = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy.MM.dd hh:mm:ss")); + String printedMessage = MessageFormat.format("[{0}] {1} {2} - {3}", level, date, name, message); + + for(MessageHandler messageHandler : handlers) + messageHandler.log(printedMessage); + + } + } + private void log(Level level, String format, Object... args) { + if (this.level.ordinal() <= level.ordinal()) { + String message = MessageFormat.format(format, args); + + for (MessageHandler messageHandler : handlers) + messageHandler.log(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..a20dd842 --- /dev/null +++ b/task04/src/com/example/task04/MemoryHandler.java @@ -0,0 +1,27 @@ +package com.example.task04; + +import java.util.ArrayList; + +public class MemoryHandler implements MessageHandler { + private final int maxMessages; + private final ArrayList messages = new ArrayList<>(); + private final ArrayList messageHandlers; + + public MemoryHandler(int maxMessages, ArrayList messageHandlers) { + this.maxMessages = maxMessages; + this.messageHandlers = messageHandlers; + } + + public void log(String message) { + messages.add(message); + + if(messages.size() >= maxMessages) { + for(MessageHandler messageHandler : messageHandlers) { + for(String msg : messages) { + messageHandler.log(msg); + } + } + messages.clear(); + } + } +} \ 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..bc432e69 --- /dev/null +++ b/task04/src/com/example/task04/MessageHandler.java @@ -0,0 +1,5 @@ +package com.example.task04; + +public interface MessageHandler { + void log(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..b39e73f4 --- /dev/null +++ b/task04/src/com/example/task04/RotationFileHandler.java @@ -0,0 +1,31 @@ +package com.example.task04; + +import java.io.FileWriter; +import java.io.IOException; +import java.text.MessageFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; + +public class RotationFileHandler implements MessageHandler { + + private final ChronoUnit chronoUnit; + + public RotationFileHandler(ChronoUnit chronoUnit) { + this.chronoUnit = chronoUnit; + } + + @Override + public void log(String message) { + LocalDateTime date = LocalDateTime.now().truncatedTo(chronoUnit); + + try { + FileWriter writer = new FileWriter(MessageFormat.format("log-{0}.txt", + date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd_hh-mm-ss")), true)); + writer.append(message + "\n"); + writer.flush(); + } catch (IOException exception) { + System.out.println(exception.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..0a2b819b 100644 --- a/task04/src/com/example/task04/Task04Main.java +++ b/task04/src/com/example/task04/Task04Main.java @@ -1,7 +1,22 @@ package com.example.task04; +import java.time.temporal.ChronoUnit; +import java.util.ArrayList; + public class Task04Main { public static void main(String[] args) { + ArrayList handlers = new ArrayList<>(); + + handlers.add(new ConsoleHandler()); + handlers.add(new FileHandler()); + handlers.add(new MemoryHandler(5, handlers)); + handlers.add(new RotationFileHandler(ChronoUnit.SECONDS)); + + Logger infoLogger = new Logger("forInfo", handlers); + Logger warningLogger = new Logger("forWarning", Level.WARNING, handlers); + + infoLogger.info("This is info log"); + warningLogger.warning("Your brain bomb activated"); } -} +} \ No newline at end of file