diff --git a/task01/src/com/example/task01/Logger.java b/task01/src/com/example/task01/Logger.java new file mode 100644 index 00000000..5b8ded80 --- /dev/null +++ b/task01/src/com/example/task01/Logger.java @@ -0,0 +1,85 @@ +package com.example.task01; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class Logger { + private String Name; + private Level currentLevel = Level.DEBUG; + private static final Map loggers = new HashMap<>(); + 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; } + } + Logger(String name){ + this.Name = name; + } + public void setName(String name){ + this.Name = name; + } + public String getName(){ + return this.Name; + } + public Level getLevel() { + return currentLevel; + } + + public void setLevel(Level level) { + this.currentLevel = level; + } + public static Logger getLogger(String name) { + return loggers.computeIfAbsent(name, Logger::new); + } + public void log(Level lvl, String message) + { + if (lvl.getPriority() >= currentLevel.getPriority()) { + String timestamp = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss").format(new Date()); + System.out.printf("[%s] %s %s - %s%n", lvl.name(), timestamp, Name, message); + } + } + public void log(Level lvl, String message, Object... args) { + log(lvl, String.format(message, args)); + } + public void debug(String message) { + log(Level.DEBUG, message); + } + + public void debug(String message, Object... args) { + log(Level.DEBUG, message, args); + } + + public void info(String message) { + log(Level.INFO, message); + } + + public void info(String message, Object... args) { + log(Level.INFO, message, args); + } + + public void warning(String message) { + log(Level.WARNING, message); + } + + public void warning(String message, Object... args) { + log(Level.WARNING, message, args); + } + + public void error(String message) { + log(Level.ERROR, message); + } + + public void error(String message, Object... args) { + log(Level.ERROR, message, 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..85ca62cc --- /dev/null +++ b/task02/src/com/example/task02/DiscountBill.java @@ -0,0 +1,21 @@ +package com.example.task02; + +public class DiscountBill extends Bill{ + private double Discount; + + @Override + public long getPrice(){ + return (long)(super.getPrice() - super.getPrice() * (Discount / 100)); + } + + public long getAbsDiscount(){ + return super.getPrice() - getPrice(); + } + + public void setDiscount(double discount){ + this.Discount = discount; + } + public String getDiscount(){ + return this.Discount + "%"; + } +} diff --git a/task03/src/com/example/task03/Hours.java b/task03/src/com/example/task03/Hours.java new file mode 100644 index 00000000..4692a44b --- /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 * 60 * 60 * 1000; + } + + @Override + public long toSeconds() { + return amount * 60 * 60; + } + + @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..4110b2c6 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 / 1000d); } @Override public long toMinutes() { - return amount / 1000 * 60; + return Math.round(amount / 1000d / 60d); + } + + @Override + public long toHours() { + return Math.round(amount / 1000d / 60d / 60d); } } diff --git a/task03/src/com/example/task03/Minutes.java b/task03/src/com/example/task03/Minutes.java index d6fa0594..10fa3655 100644 --- a/task03/src/com/example/task03/Minutes.java +++ b/task03/src/com/example/task03/Minutes.java @@ -2,26 +2,29 @@ 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 / 60d); } } diff --git a/task03/src/com/example/task03/Seconds.java b/task03/src/com/example/task03/Seconds.java index ce6bc213..1c348772 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 / 60d); + } + + @Override + public long toHours() { + return Math.round(amount / 60d / 60d); } } 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..934bc12e 100644 --- a/task03/src/com/example/task03/TimeUnitUtils.java +++ b/task03/src/com/example/task03/TimeUnitUtils.java @@ -5,23 +5,41 @@ */ public class TimeUnitUtils { - /** - * Конвертирует интервал в секундах в интервал в миллисекундах - * - * @param seconds интервал в секундах - * @return интервал в миллисекундах - */ + public static Milliseconds toMillis(Hours hours) { + return new Milliseconds(hours.toMillis()); + } + public static Milliseconds toMillis(Minutes minutes) { + return new Milliseconds(minutes.toMillis()); + } public static Milliseconds toMillis(Seconds seconds) { return new Milliseconds(seconds.toMillis()); } - - /** - * Конвертирует интервал в миллисекундах в интервал в секундах - * - * @param millis интервал в миллисекундах - * @return интервал в секундах - */ + public static Seconds toSeconds(Hours hours) { + return new Seconds(hours.toSeconds()); + } + public static Seconds toSeconds(Minutes minutes) { + return new Seconds(minutes.toSeconds()); + } public static Seconds toSeconds(Milliseconds millis) { return new Seconds(millis.toSeconds()); } + public static Minutes toMinutes(Hours hours) { + return new Minutes(hours.toMinutes()); + } + public static Minutes toMinutes(Minutes minutes) { + return new Minutes(minutes.toMinutes()); + } + public static Minutes toMinutes(Milliseconds millis) { + return new Minutes(millis.toMinutes()); + } + public static Hours toHours(Hours hours) { + return new Hours(hours.toHours()); + } + public static Hours toHours(Minutes minutes) { + return new Hours(minutes.toHours()); + } + public static Hours toHours(Milliseconds millis) { + return new Hours(millis.toHours()); + } + } diff --git a/task04/src/com/example/task04/ConsoleHandler.java b/task04/src/com/example/task04/ConsoleHandler.java new file mode 100644 index 00000000..94bc1c80 --- /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 handleMessage(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..d00550af --- /dev/null +++ b/task04/src/com/example/task04/FileHandler.java @@ -0,0 +1,22 @@ +package com.example.task04; + +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; + +public class FileHandler implements MessageHandler { + public String FilePath; + + public FileHandler(String filePath) { + this.FilePath = filePath; + } + + @Override + public void handleMessage(String message) { + try (BufferedWriter writer = new BufferedWriter(new FileWriter(FilePath, true))) { + writer.write(message); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/task04/src/com/example/task04/Logger.java b/task04/src/com/example/task04/Logger.java new file mode 100644 index 00000000..09b54e1c --- /dev/null +++ b/task04/src/com/example/task04/Logger.java @@ -0,0 +1,52 @@ +package com.example.task04; + +import java.text.SimpleDateFormat; +import java.util.*; + +public class Logger { + private String Name; + private Level currentLevel = Level.DEBUG; + private static final Map loggers = new HashMap<>(); + MessageHandler handler; + 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; } + } + Logger(String name){ + this.Name = name; + } + public void setName(String name){ + this.Name = name; + } + public String getName(){ + return this.Name; + } + public Level getLevel() { + return currentLevel; + } + + public void setLevel(Level level) { + this.currentLevel = level; + } + public static Logger getLogger(String name) { + return loggers.computeIfAbsent(name, Logger::new); + } + public void SetHandler(MessageHandler handler){ + this.handler = handler; + } + public void log(MessageHandler handler, Level lvl, String message) + { + if (lvl.getPriority() >= currentLevel.getPriority()) { + handler.handleMessage(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..d5a57c04 --- /dev/null +++ b/task04/src/com/example/task04/MemoryHandler.java @@ -0,0 +1,28 @@ +package com.example.task04; + +import java.util.ArrayList; +import java.util.List; + +public class MemoryHandler implements MessageHandler{ + private final List messageBuffer = new ArrayList<>(); + private final int bufferSize; + private final ConsoleHandler proxiedHandler; + + public MemoryHandler(ConsoleHandler proxiedHandler, int bufferSize) { + this.proxiedHandler = proxiedHandler; + this.bufferSize = bufferSize; + } + public void push() { + for (String msg : messageBuffer) { + proxiedHandler.handleMessage(msg); + } + messageBuffer.clear(); + } + @Override + public void handleMessage(String message) { + messageBuffer.add(message); + if (messageBuffer.size() >= bufferSize) { + push(); + } + } +} diff --git a/task04/src/com/example/task04/MessageHandler.java b/task04/src/com/example/task04/MessageHandler.java new file mode 100644 index 00000000..ab661a7f --- /dev/null +++ b/task04/src/com/example/task04/MessageHandler.java @@ -0,0 +1,6 @@ +package com.example.task04; + +@FunctionalInterface +public interface MessageHandler { + void handleMessage(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..7871fb44 --- /dev/null +++ b/task04/src/com/example/task04/RotationFileHandler.java @@ -0,0 +1,38 @@ +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 extends FileHandler implements MessageHandler{ + private ChronoUnit RotationUnit; + private LocalDateTime LastRotation; + private FileWriter Writer; + + public RotationFileHandler(String filePath) { + super(filePath); + } + + private void rotateFile() throws IOException { + if (Writer != null) { + Writer.close(); + } + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HH-mm"); + String rotatedFilePath = FilePath + "_" + LastRotation.format(formatter); + Writer = new FileWriter(rotatedFilePath, true); + } + @Override + public void handleMessage(String message) { + try { + if (LocalDateTime.now().isAfter(LastRotation.plus(1, RotationUnit))) { + LastRotation = LocalDateTime.now(); + rotateFile(); + } + Writer.write(message); + } catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file