diff --git a/task01/src/com/example/task01/Level.java b/task01/src/com/example/task01/Level.java new file mode 100644 index 00000000..ca6f18ba --- /dev/null +++ b/task01/src/com/example/task01/Level.java @@ -0,0 +1,8 @@ +package com.example.task01; + +public enum Level { + 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..b047f9df --- /dev/null +++ b/task01/src/com/example/task01/Logger.java @@ -0,0 +1,93 @@ +package com.example.task01; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class Logger { + private static final Map loggers = new HashMap<>(); + + private final String name; + private Level level; + + Logger(String name) { + this.name = name; + this.level = Level.DEBUG; + loggers.put(name, this); + } + public String getName() + { + return name; + } + public static Logger getLogger(String name) + { + if (loggers.get(name) == null) loggers.put(name, new Logger(name)); + return loggers.get(name); + } + public Level getLevel() + { + return level; + } + public void setLevel(Level level) + { + this.level=level; + } + + public void log(Level level,String message) + { + if (this.level.ordinal()<=level.ordinal()) + { + System.out.println(formatMessage(level, message)); + } + } + + public void log(Level level, String format, Object... args) { + if (this.level.ordinal() <= level.ordinal()) { + String message = String.format(format, args); + System.out.println(formatMessage(level, message)); + } + } + + private String formatMessage(Level level, String message) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); + String timestamp = dateFormat.format(new Date()); + return String.format("[%s] %s %s - %s", level, timestamp, name, message); + } + + public void debug(String massage) + { + log(Level.DEBUG, massage); + } + public void debug(String format,Object... args) + { + log(Level.DEBUG, format, args); + } + + public void info(String massage) + { + log(Level.INFO, massage); + } + public void info(String format,Object... args) + { + log(Level.INFO, format, args); + } + + public void warning(String massage) + { + log(Level.WARNING, massage); + } + public void warning(String format,Object... args) + { + log(Level.WARNING, format, args); + } + + public void error(String massage) + { + log(Level.ERROR, massage); + } + public void error(String format,Object... args) + { + log(Level.ERROR, format, 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..8590973b --- /dev/null +++ b/task02/src/com/example/task02/DiscountBill.java @@ -0,0 +1,49 @@ +package com.example.task02; + +public class DiscountBill extends Bill{ + /** + * @discount Скидка в десятичном виде + */ + private final double discount; + + DiscountBill(double discount) + { + this.discount=discount; + } + /** + * Выводит скидку в процентах + * + * @return Скидка в процентах + */ + public double getDiscount() + { + return discount*100; + } + + /** + * Подсчитывает общую сумму покупки со скидкой!!! + * + * @return общая стоимость покупки со скидкой!!! + */ + @Override + public long getPrice() + { + return Math.round(super.getPrice()*(1-discount)); + } + + public long calculateAbsoluteDiscount() + { + return super.getPrice()-getPrice(); + } + + @Override + public String toString() + { + return super.toString() + + "\nСкидка: " + + getDiscount() + "%" + + "%\nАбсолютное значение скидки: " + + calculateAbsoluteDiscount() + + "\nИтоговая сумма: " + getPrice(); + } +} diff --git a/task02/src/com/example/task02/Task02Main.java b/task02/src/com/example/task02/Task02Main.java index e589f2d3..2196846c 100644 --- a/task02/src/com/example/task02/Task02Main.java +++ b/task02/src/com/example/task02/Task02Main.java @@ -10,7 +10,7 @@ public class Task02Main { private static final Item ITEM6 = new Item("Товар 6", 60); public static void main(String[] args) { - Bill bill = new Bill(); + DiscountBill bill = new DiscountBill(0.111); bill.add(ITEM1, 10); bill.add(ITEM3, 3); bill.add(ITEM6, 1); diff --git a/task03/src/com/example/task03/Hours.java b/task03/src/com/example/task03/Hours.java new file mode 100644 index 00000000..59dc0aa3 --- /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 getHours() { + return amount; + } +} diff --git a/task03/src/com/example/task03/Milliseconds.java b/task03/src/com/example/task03/Milliseconds.java index 5115bc7d..cf0d61ee 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 getHours() { + return Math.round(amount/(1000*60*60f)); } } diff --git a/task03/src/com/example/task03/Minutes.java b/task03/src/com/example/task03/Minutes.java index d6fa0594..ad2b13b9 100644 --- a/task03/src/com/example/task03/Minutes.java +++ b/task03/src/com/example/task03/Minutes.java @@ -2,26 +2,28 @@ 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 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..3f1b2550 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 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..dc32092a 100644 --- a/task03/src/com/example/task03/TimeUnit.java +++ b/task03/src/com/example/task03/TimeUnit.java @@ -28,4 +28,12 @@ public interface TimeUnit { */ long toMinutes(); + /** + * Возвращает продолжительность текущего интервала, пересчитанного в часах. + * При необходимости округлять по обычным правилам округления (число, меньшее 0.5 переходит в 0, большее или равное - в 1) + * + * @return количество часов в текущем интервале + */ + long getHours(); + } diff --git a/task03/src/com/example/task03/TimeUnitUtils.java b/task03/src/com/example/task03/TimeUnitUtils.java index 790f8850..5ec3f9a1 100644 --- a/task03/src/com/example/task03/TimeUnitUtils.java +++ b/task03/src/com/example/task03/TimeUnitUtils.java @@ -15,6 +15,26 @@ public static Milliseconds toMillis(Seconds seconds) { return new Milliseconds(seconds.toMillis()); } + /** + * Конвертирует интервал в минутах в интервал в миллисекундах + * + * @param minutes интервал в минутах + * @return интервал в миллисекундах + */ + public static Milliseconds toMillis(Minutes minutes) { + return new Milliseconds(minutes.toMillis()); + } + + /** + * Конвертирует интервал в часах в интервал в миллисекундах + * + * @param hours интервал в часах + * @return интервал в миллисекундах + */ + public static Milliseconds toMillis(Hours hours) { + return new Milliseconds(hours.toMillis()); + } + /** * Конвертирует интервал в миллисекундах в интервал в секундах * @@ -24,4 +44,77 @@ public static Milliseconds toMillis(Seconds seconds) { public static Seconds toSeconds(Milliseconds millis) { return new Seconds(millis.toSeconds()); } + /** + * Конвертирует интервал в минутах в интервал в секундах + * + * @param minutes интервал в минутах + * @return интервал в секундах + */ + public static Seconds toSeconds(Minutes minutes) { + return new Seconds(minutes.toSeconds()); + } + /** + * Конвертирует интервал в часах в интервал в секундах + * + * @param hours интервал в часах + * @return интервал в секундах + */ + public static Seconds toSeconds(Hours hours) { + return new Seconds(hours.toSeconds()); + } + /** + * Конвертирует интервал в миллисекундах в интервал в минутах + * + * @param millis интервал в миллисекундах + * @return интервал в минутах + */ + public static Minutes toMinutes(Milliseconds millis) { + return new Minutes(millis.toMinutes()); + } + /** + * Конвертирует интервал в секундах в интервал в минутах + * + * @param seconds интервал в секундах + * @return интервал в минутах + */ + public static Minutes toMinutes(Seconds seconds) { + return new Minutes(seconds.toMinutes()); + } + /** + * Конвертирует интервал в часах в интервал в минутах + * + * @param hours интервал в часах + * @return интервал в минутах + */ + public static Minutes toMinutes(Hours hours) { + return new Minutes(hours.toMinutes()); + } + /** + * Конвертирует интервал в миллисекундах в интервал в часах + * + * @param milliseconds интервал в миллисекундах + * @return интервал в часах + */ + public static Hours getHours(Milliseconds milliseconds) { + return new Hours(milliseconds.getHours()); + } + /** + * Конвертирует интервал в секундах в интервал в часах + * + * @param seconds интервал в секундах + * @return интервал в часах + */ + public static Hours getHours(Seconds seconds) { + return new Hours(seconds.getHours()); + } + /** + * Конвертирует интервал в минутах в интервал в часах + * + * @param minutes интервал в минутах + * @return интервал в часах + */ + public static Hours getHours(Minutes minutes) { + return new Hours(minutes.getHours()); + } + } diff --git a/task04/src/com/example/task04/ConsoleHandler.java b/task04/src/com/example/task04/ConsoleHandler.java new file mode 100644 index 00000000..b0b030ff --- /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..33a761c0 --- /dev/null +++ b/task04/src/com/example/task04/FileHandler.java @@ -0,0 +1,23 @@ +package com.example.task04; + +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; + +public class FileHandler implements MessageHandler { + private final String filePath; + + public FileHandler(String filePath) { + this.filePath = filePath; + } + + @Override + public void log(String message) { + try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath, true))) { + writer.write(message); + writer.newLine(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/task04/src/com/example/task04/Level.java b/task04/src/com/example/task04/Level.java new file mode 100644 index 00000000..277816f3 --- /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 +} diff --git a/task04/src/com/example/task04/Logger.java b/task04/src/com/example/task04/Logger.java new file mode 100644 index 00000000..302d85ca --- /dev/null +++ b/task04/src/com/example/task04/Logger.java @@ -0,0 +1,102 @@ +package com.example.task04; + +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class Logger { + private static final List loggers = new ArrayList<>(); + + private final String name; + private Level level; + private final List handlers; + + private Logger(String name) { + this.name = name; + this.level = Level.DEBUG; + this.handlers = new ArrayList<>(); + } + + public static Logger getLogger(String name) { + for (Logger logger : loggers) { + if (logger.getName().equals(name)) { + return logger; + } + } + Logger logger = new Logger(name); + loggers.add(logger); + return logger; + } + + public String getName() { + return name; + } + + public void setLevel(Level level) { + this.level = level; + } + + public Level getLevel() { + return level; + } + + public void addHandler(MessageHandler handler) { + handlers.add(handler); + } + + 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); + } + + public void log(Level level, String message) { + if (this.level.ordinal() <= level.ordinal()) { + String formattedMessage = formatMessage(level, message); + for (MessageHandler handler : handlers) { + handler.log(formattedMessage); + } + } + } + + public void log(Level level, String format, Object... args) { + if (this.level.ordinal() <= level.ordinal()) { + String message = String.format(format, args); + log(level, message); + } + } + + private String formatMessage(Level level, String message) { + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss"); + String timestamp = dateFormat.format(new Date()); + return String.format("[%s] %s %s - %s", level, timestamp, name, 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..e712cbbf --- /dev/null +++ b/task04/src/com/example/task04/MemoryHandler.java @@ -0,0 +1,31 @@ +package com.example.task04; + +import java.util.ArrayList; +import java.util.List; + +public class MemoryHandler implements MessageHandler { + private final List messages; + private final int bufferSize; + private final MessageHandler targetHandler; + + public MemoryHandler(int bufferSize, MessageHandler targetHandler) { + this.bufferSize = bufferSize; + this.targetHandler = targetHandler; + this.messages = new ArrayList<>(bufferSize); + } + + @Override + public void log(String message) { + messages.add(message); + if (messages.size() >= bufferSize) { + flush(); + } + } + + public void flush() { + for (String message : messages) { + targetHandler.log(message); + } + 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..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..77872151 --- /dev/null +++ b/task04/src/com/example/task04/RotationFileHandler.java @@ -0,0 +1,36 @@ +package com.example.task04; + +import java.io.BufferedWriter; +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 final String baseFilePath; + private final ChronoUnit rotationInterval; + private LocalDateTime lastRotationTime; + + public RotationFileHandler(String baseFilePath, ChronoUnit rotationInterval) { + this.baseFilePath = baseFilePath; + this.rotationInterval = rotationInterval; + this.lastRotationTime = LocalDateTime.now(); + } + + @Override + public void log(String message) { + LocalDateTime now = LocalDateTime.now(); + if (lastRotationTime.plus(1, rotationInterval).isBefore(now)) { + lastRotationTime = now; + } + + String filePath = baseFilePath + "_" + lastRotationTime.format(DateTimeFormatter.ofPattern("yyyyMMdd_HHmmss")) + ".log"; + try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath, true))) { + writer.write(message); + writer.newLine(); + } catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file