From 85c546c5bfd68e84992c025dfd3317862029dcd3 Mon Sep 17 00:00:00 2001 From: e-mgam-e Date: Tue, 7 Oct 2025 01:09:18 +0500 Subject: [PATCH] all done --- task01/README.md | 5 +- task01/src/com/example/task01/LogLevel.java | 9 ++ task01/src/com/example/task01/Logger.java | 85 +++++++++++++++++++ .../src/com/example/task02/DiscontBill.java | 23 +++++ task03/src/com/example/task03/Hour.java | 22 +++++ .../src/com/example/task03/Milliseconds.java | 10 ++- task03/src/com/example/task03/Minutes.java | 25 ++---- task03/src/com/example/task03/Seconds.java | 5 +- task03/src/com/example/task03/TimeUnit.java | 1 + .../src/com/example/task03/TimeUnitUtils.java | 5 ++ .../com/example/task04/ConsoleHandler.java | 8 ++ .../src/com/example/task04/FileHandler.java | 16 ++++ task04/src/com/example/task04/LogLevel.java | 9 ++ task04/src/com/example/task04/Logger.java | 84 ++++++++++++++++++ .../src/com/example/task04/MemoryHandler.java | 30 +++++++ .../com/example/task04/MessageHandler.java | 5 ++ .../example/task04/RotationFileHandler.java | 28 ++++++ 17 files changed, 348 insertions(+), 22 deletions(-) create mode 100644 task01/src/com/example/task01/LogLevel.java create mode 100644 task01/src/com/example/task01/Logger.java create mode 100644 task02/src/com/example/task02/DiscontBill.java create mode 100644 task03/src/com/example/task03/Hour.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/LogLevel.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/README.md b/task01/README.md index 5e41b92c..9ae506c9 100644 --- a/task01/README.md +++ b/task01/README.md @@ -5,7 +5,10 @@ Требования к классу `Logger`: * Каждому экземпляру класса можно задать имя. Имя можно получить, вызвав публичный метод `String getName()`. -* В классе должен быть публичный статический метод `getLogger(String name)`, возвращающий экземпляр логгера с указанным именем. Повторый вызов с тем же аргументом должен возвращать тот же самый экземпляр, что и при первом вызове. Если продемонстрировать это кодом, то следующий код должен возвращать true: +* В классе должен быть публичный статический метод `getLogger(String name)`, +* возвращающий экземпляр логгера с указанным именем. +* Повторый вызов с тем же аргументом должен возвращать тот же самый экземпляр, +* что и при первом вызове. Если продемонстрировать это кодом, то следующий код должен возвращать true: ``` Logger logger1 = Logger.getLogger("test") Logger logger2 = Logger.getLogger("test") diff --git a/task01/src/com/example/task01/LogLevel.java b/task01/src/com/example/task01/LogLevel.java new file mode 100644 index 00000000..d659c76e --- /dev/null +++ b/task01/src/com/example/task01/LogLevel.java @@ -0,0 +1,9 @@ +package com.example.task01; + +public enum LogLevel { + + DEBUG, /* отдалка */ + INFO, /* информационное сообщение */ + WARNING, /* предупреждение */ + ERROR /* ошибка */ +} diff --git a/task01/src/com/example/task01/Logger.java b/task01/src/com/example/task01/Logger.java new file mode 100644 index 00000000..23a012b4 --- /dev/null +++ b/task01/src/com/example/task01/Logger.java @@ -0,0 +1,85 @@ +package com.example.task01; + + +import java.lang.reflect.Array; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; + +public class Logger { + private final String name; + private static ArrayList listLoggers; + private LogLevel logLevel; + public Logger(String name){ + this.name = name; + } + public Logger(){ + this.name = "Logger"; + } + + public String getName(){ + return name; + } + public static Logger getLogger(String name){ + for(Logger i : listLoggers){ + if(i.name .equals(name)){ + return i; + } + } + Logger newLogger = new Logger(name); + listLoggers.add(newLogger); + return newLogger; + } + public LogLevel getLevel(){ + return logLevel; + } + public void setLevel(LogLevel logLevel){ + this.logLevel = logLevel; + } + + public void error(String message){ + log(LogLevel.ERROR, message); + } + public void error(String format, Object... args){ + log(LogLevel.ERROR, 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 info(String message){ + log(LogLevel.INFO, message); + } + public void info(String format, Object... args){ + log(LogLevel.INFO, format, args); + } + + public void debug(String message){ + log(LogLevel.DEBUG, message); + } + public void debug(String format, Object... args){ + log(LogLevel.DEBUG,format,args); + } + + public void log(LogLevel logLevel, String message){ + + if(logLevel.compareTo(this.logLevel) >= 0){ + System.out.println(formatMessage(logLevel, message)); + } + } + public void log(LogLevel logLevel, String format, Object... args){ + if(logLevel.compareTo(this.logLevel) >= 0){ + System.out.println(formatMessage(logLevel, String.format(format, args))); + } + } + + private String formatMessage(LogLevel logLevel, String Message){ + String date = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()); + + return String.format("[%s] %s %s - %s", logLevel.name(), date, this.name, Message); + } +} diff --git a/task02/src/com/example/task02/DiscontBill.java b/task02/src/com/example/task02/DiscontBill.java new file mode 100644 index 00000000..7134165d --- /dev/null +++ b/task02/src/com/example/task02/DiscontBill.java @@ -0,0 +1,23 @@ +package com.example.task02; + +public class DiscontBill extends Bill{ + private final double discont; + public DiscontBill(int discont) { + this.discont = discont; + } + public String getDiscont() { + return discont + "%"; + } + + @Override + public long getPrice() { + double disc = super.getPrice() * (discont / 100); + + double price = super.getPrice(); + return (long)Math.abs(disc - price); + } + + public long getAbsoluteDiscont() { + return super.getPrice()- getPrice(); + } +} diff --git a/task03/src/com/example/task03/Hour.java b/task03/src/com/example/task03/Hour.java new file mode 100644 index 00000000..7ceb728b --- /dev/null +++ b/task03/src/com/example/task03/Hour.java @@ -0,0 +1,22 @@ +package com.example.task03; + +public class Hour implements TimeUnit{ + + private final long amount; + + public Hour(long amount) { + this.amount = amount; + } + + @Override + public long toMillis() { return amount * 60 * 60 * 1000; } + + @Override + public long toSeconds() { return amount * 60 * 60; } + + @Override + public long toMinutes() { return amount * 60; } + + @Override + public long getHours() { return amount; } +} diff --git a/task03/src/com/example/task03/Milliseconds.java b/task03/src/com/example/task03/Milliseconds.java index 5115bc7d..ae5d01e5 100644 --- a/task03/src/com/example/task03/Milliseconds.java +++ b/task03/src/com/example/task03/Milliseconds.java @@ -18,11 +18,13 @@ public long toMillis() { @Override public long toSeconds() { - return amount / 1000; + return Math.round(amount / 1000f); } @Override - public long toMinutes() { - return amount / 1000 * 60; - } + public long toMinutes() { return Math.round((float) amount / 1000 / 60f); } + + @Override + public long getHours() { return Math.round((float) amount / 1000 / 3600f); } + } diff --git a/task03/src/com/example/task03/Minutes.java b/task03/src/com/example/task03/Minutes.java index d6fa0594..6d595a8c 100644 --- a/task03/src/com/example/task03/Minutes.java +++ b/task03/src/com/example/task03/Minutes.java @@ -2,26 +2,19 @@ public class Minutes implements TimeUnit { - public Minutes(long amount) { - // TODO: реализовать - throw new UnsupportedOperationException(); - } + private final long amount; + + public Minutes(long amount) { this.amount = amount; } + + @Override + public long toMillis() { return amount * 60 * 1000; } @Override - public long toMillis() { - // TODO: реализовать - throw new UnsupportedOperationException(); - } + public long toSeconds() { return amount * 60; } @Override - public long toSeconds() { - // TODO: реализовать - throw new UnsupportedOperationException(); - } + public long toMinutes() { return amount; } @Override - public long toMinutes() { - // TODO: реализовать - throw new UnsupportedOperationException(); - } + public long getHours() { 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..cb9a05b5 100644 --- a/task03/src/com/example/task03/Seconds.java +++ b/task03/src/com/example/task03/Seconds.java @@ -23,6 +23,9 @@ public long toSeconds() { @Override public long toMinutes() { - return Math.round(amount / 60); + return Math.round(amount / 60f); } + + @Override + public long getHours() { return Math.round(amount / 3600f); } } 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..40425d13 100644 --- a/task03/src/com/example/task03/TimeUnitUtils.java +++ b/task03/src/com/example/task03/TimeUnitUtils.java @@ -24,4 +24,9 @@ public static Milliseconds toMillis(Seconds seconds) { public static Seconds toSeconds(Milliseconds millis) { return new Seconds(millis.toSeconds()); } + + public static Minutes toMinutes(Seconds seconds) { return new Minutes(seconds.toMinutes()); } + public static Seconds toSeconds(Minutes minutes) {return new Seconds(minutes.toSeconds()); } + public static Hour toHours(Minutes minutes) { return new Hour(minutes.getHours()); } + public static Minutes toMinutes(Hour hours) { return new Minutes(hours.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..a2a9fa5d --- /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); + } +} diff --git a/task04/src/com/example/task04/FileHandler.java b/task04/src/com/example/task04/FileHandler.java new file mode 100644 index 00000000..5bed1de9 --- /dev/null +++ b/task04/src/com/example/task04/FileHandler.java @@ -0,0 +1,16 @@ +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", false)){ + writer.write(message + "/n"); + } + catch (IOException ex){ + System.out.println(ex.getMessage()); + } + } +} diff --git a/task04/src/com/example/task04/LogLevel.java b/task04/src/com/example/task04/LogLevel.java new file mode 100644 index 00000000..8a165e3b --- /dev/null +++ b/task04/src/com/example/task04/LogLevel.java @@ -0,0 +1,9 @@ +package com.example.task04; + +public enum LogLevel { + + DEBUG, /* отдалка */ + INFO, /* информационное сообщение */ + WARNING, /* предупреждение */ + ERROR /* ошибка */ +} diff --git a/task04/src/com/example/task04/Logger.java b/task04/src/com/example/task04/Logger.java new file mode 100644 index 00000000..605cbe79 --- /dev/null +++ b/task04/src/com/example/task04/Logger.java @@ -0,0 +1,84 @@ +package com.example.task04; + + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; + +public class Logger { + private final String name; + private static ArrayList listLoggers; + private LogLevel logLevel; + public Logger(String name){ + this.name = name; + } + public Logger(){ + this.name = "Logger"; + } + + public String getName(){ + return name; + } + public static Logger getLogger(String name){ + for(Logger i : listLoggers){ + if(i.name .equals(name)){ + return i; + } + } + Logger newLogger = new Logger(name); + listLoggers.add(newLogger); + return newLogger; + } + public LogLevel getLevel(){ + return logLevel; + } + public void setLevel(LogLevel logLevel){ + this.logLevel = logLevel; + } + + public void error(String message){ + log(LogLevel.ERROR, message); + } + public void error(String format, Object... args){ + log(LogLevel.ERROR, 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 info(String message){ + log(LogLevel.INFO, message); + } + public void info(String format, Object... args){ + log(LogLevel.INFO, format, args); + } + + public void debug(String message){ + log(LogLevel.DEBUG, message); + } + public void debug(String format, Object... args){ + log(LogLevel.DEBUG,format,args); + } + + public void log(LogLevel logLevel, String message){ + + if(logLevel.compareTo(this.logLevel) >= 0){ + System.out.println(formatMessage(logLevel, message)); + } + } + public void log(LogLevel logLevel, String format, Object... args){ + if(logLevel.compareTo(this.logLevel) >= 0){ + System.out.println(formatMessage(logLevel, String.format(format, args))); + } + } + + private String formatMessage(LogLevel logLevel, String Message){ + String date = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss").format(new Date()); + + return String.format("[%s] %s %s - %s", logLevel.name(), date, this.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..18efa6d6 --- /dev/null +++ b/task04/src/com/example/task04/MemoryHandler.java @@ -0,0 +1,30 @@ +package com.example.task04; + +import java.util.ArrayList; + +public class MemoryHandler implements MessageHandler{ + private final ArrayList messages = new ArrayList<>(); + private final MessageHandler proxyHandler; //для использования разных обработчиков для вывода + private final int messageLimit; //кол-во после которого сбрасываем сообщения + + public MemoryHandler(MessageHandler proxyHandler, int messageLimit) { + this.proxyHandler = proxyHandler; + this.messageLimit = messageLimit; + } + + @Override + public void log(String message) { + messages.add(message); + if (messages.size() >= messageLimit) { + explicitLog(); + } + } + + //метод для явного вызова и аккумулирования сообщения в памяти + public void explicitLog() { + for (String msg : messages) { + proxyHandler.log(msg); + } + messages.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..13beca02 --- /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); +} diff --git a/task04/src/com/example/task04/RotationFileHandler.java b/task04/src/com/example/task04/RotationFileHandler.java new file mode 100644 index 00000000..7d05aef0 --- /dev/null +++ b/task04/src/com/example/task04/RotationFileHandler.java @@ -0,0 +1,28 @@ +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()); + } + } +}