Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
100 changes: 100 additions & 0 deletions task01/src/com/example/task01/Task01Main.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,107 @@
package com.example.task01;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
import java.util.HashMap;

class Logger {

public enum Level{
DEBUG,
INFO,
WARNING,
ERROR
}

private final String name;
private static final Map<String, Logger> loggers = new HashMap<>();
private Level level = Level.DEBUG;

private Logger(String name){
this.name = name;
}

public String getName(){
return name;
}

public static Logger getLogger(String nickName){
if (!loggers.containsKey(nickName)){
loggers.put(nickName, new Logger(nickName));
}
return loggers.get(nickName);
}

public void setLevel(Level level){
this.level = level;
}

public Level getLevel(){
return level;
}

private String formatTimestamp(){
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd");
SimpleDateFormat timeFormat = new SimpleDateFormat("HH:mm:ss");
return dateFormat.format(new Date()) + " " + timeFormat.format(new Date());
}

public void log(Level level, String message){
if (level.ordinal() >= this.level.ordinal()){
System.out.println(String.format("[%s] %s %s - %s", level, formatTimestamp(), name, message));
}
}

public void log (Level level, String format, Object... args){
if (level.ordinal() >= this.level.ordinal()){
String message = String.format(format, args);
System.out.println(String.format("[%s] %s %s - %s", level, formatTimestamp(), name, message));
}
}

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 class Task01Main {
public static void main(String[] args) {
Logger logger = Logger.getLogger("myLogger");
logger.setLevel(Logger.Level.WARNING);
logger.debug("Это сообщение не появится");
logger.warning("Предупреждение: что-то пошло не так");
logger.error("Ошибка: %s", "критическая ситуация");

}
}
32 changes: 32 additions & 0 deletions task02/src/com/example/task02/DiscountBill.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.example.task02;

public class DiscountBill extends Bill{
private double discountPercentage;

public DiscountBill(double discountPercentage){
setDiscountPercentage(discountPercentage);
}

public void setDiscountPercentage(double discountPercentage){
if (discountPercentage < 0 || discountPercentage > 100){
throw new IllegalArgumentException("Скидка должна быть в диапазона от 1 до 100");
}
this.discountPercentage = discountPercentage;
}

public double getDiscountPercentage(){
return discountPercentage;
}

public long getDiscountAbsolute(){
long originalPrice = super.getPrice();
return Math.round(originalPrice * discountPercentage / 100);
}

public long getPrice(){
long originalPrice = super.getPrice();
long discount = getDiscountAbsolute();
return originalPrice - discount;
}

}
2 changes: 2 additions & 0 deletions task02/src/com/example/task02/Task02Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,5 @@ public static void main(String[] args) {
System.out.println(bill);
}
}


3 changes: 2 additions & 1 deletion task03/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,5 @@
Этапы выполнения задания:
* Реализовать класс `Hours`, который определяет интервал в часах
* Добавить методы по переводу интервалов из одних единиц в другие в классе `TimeUnitUtils`
* Добавить новый метод в интерфейс `TimeUnit` - `long getHours()`, возвращающий количество часов в интервале. Реализовать новый метод для существующих классов интервалов и добавить новый класс `Hours`.
* Добавить новый метод в интерфейс `TimeUnit` - `long getHours()`, возвращающий количество часов в интервале.
* Реализовать новый метод для существующих классов интервалов и добавить новый класс `Hours`.
18 changes: 18 additions & 0 deletions task03/src/com/example/task03/Hours.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.example.task03;

public class Hours implements TimeUnit{

private final long amount;

public Hours(long amount) {
this.amount = amount;
}

public long toMillis() { return amount * 60 * 60 * 1000; }

public long toSeconds() {return amount * 60 * 60; }

public long toMinutes() {return amount * 60; }

public long toHours() { return amount; }
}
7 changes: 5 additions & 2 deletions task03/src/com/example/task03/Milliseconds.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,14 @@ public long toMillis() {

@Override
public long toSeconds() {
return amount / 1000;
return Math.round((float)amount / 1000);
}

@Override
public long toMinutes() {
return amount / 1000 * 60;
return Math.round((float)amount / (1000 * 60));
}

@Override
public long toHours() { return Math.round((float)amount / (1000 * 60 * 60)); }
}
21 changes: 13 additions & 8 deletions task03/src/com/example/task03/Minutes.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,31 @@

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 * 1000 * 60;
}

@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((float)amount / 60);
}


}
7 changes: 4 additions & 3 deletions task03/src/com/example/task03/Seconds.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ public long toSeconds() {
}

@Override
public long toMinutes() {
return Math.round(amount / 60);
}
public long toMinutes() { return Math.round((float)amount / 60); }

@Override
public long toHours() { return Math.round((float) amount /(60 *60)); }
}
1 change: 1 addition & 0 deletions task03/src/com/example/task03/Task03Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@ private static void printTimeUnit(TimeUnit unit) {
System.out.println(String.format("Minutes: %d", unit.toMinutes()));
}
}

1 change: 1 addition & 0 deletions task03/src/com/example/task03/TimeUnit.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,5 @@ public interface TimeUnit {
*/
long toMinutes();

long toHours();
}
4 changes: 4 additions & 0 deletions task03/src/com/example/task03/TimeUnitUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -24,4 +24,8 @@ public static Milliseconds toMillis(Seconds seconds) {
public static Seconds toSeconds(Milliseconds millis) {
return new Seconds(millis.toSeconds());
}

public static Hours toHours(TimeUnit unit) {
return new Hours(unit.toHours());
}
}
16 changes: 11 additions & 5 deletions task04/README.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
# Задание 04 - Продвинутый логгер

В предыдущем задании был реализован класс, логирующий сообщения в определенном формате в консоль.
Необходимо модифицировать данный класс таким образом, чтобы можно было позволить логгировать не только в консоль, но и в файл, память или что-либо еще.
Необходимо модифицировать данный класс таким образом, чтобы можно было позволить логгировать не только
в консоль, но и в файл, память или что-либо еще.

Для реализации данной задачи потребуется ввести дополнительный уровень абстракции - интерфейс `MessageHandler`, который по своей логике будет заниматься конечной обработкой сообщений логгера.
Для реализации данной задачи потребуется ввести дополнительный уровень абстракции - интерфейс `MessageHandler`,
который по своей логике будет заниматься конечной обработкой сообщений логгера.

В качестве конечных обработчиков сообщений нужно реализовать следующие:
* `ConsoleHandler` - обработчик, выводящий сообщения в консоль
* `FileHandler` - обработчик, выводящий сообщения в файл
* `RotationFileHandler` - обработчик, выводящий сообщения в файл с определенной ротацией - например, для каждого часа создается свой файл. Для данного обработчика нужно иметь возможность выставлять интервал ротации (например, с помощью java.time.temporal.ChronoUnit, либо другим удобным способом).
* `MemoryHandler` - обработчик - прокси, который может аккумулировать сообщения в памяти и при необходимости (явном вызове метода или при достижении определенного объема) отправлять их в проксируемый обработчик.
* `RotationFileHandler` - обработчик, выводящий сообщения в файл с определенной ротацией - например, для каждого
* часа создается свой файл. Для данного обработчика нужно иметь возможность выставлять интервал ротации
* (например, с помощью java.time.temporal.ChronoUnit, либо другим удобным способом).
* `MemoryHandler` - обработчик - прокси, который может аккумулировать сообщения в памяти и при необходимости
* (явном вызове метода или при достижении определенного объема) отправлять их в проксируемый обработчик.

Например, с помощью данного класса мы должны уметь отправлять сообщения в консоль (или файл), но только определенными "порциями".
Например, с помощью данного класса мы должны уметь отправлять сообщения в консоль (или файл), но только
* определенными "порциями".

Логгер должен иметь возможность использовать несколько обработчиков одновременно.
14 changes: 14 additions & 0 deletions task04/src/com/example/task04/ConsoleHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.example.task04;

public class ConsoleHandler implements MessageHandler{

@Override
public void publish(String formattedMessage) {
System.out.println(formattedMessage);
}

@Override
public void close() {

}
}
33 changes: 33 additions & 0 deletions task04/src/com/example/task04/FileHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.example.task04;
import java.io.*;
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

public class FileHandler implements MessageHandler{

private final BufferedWriter writer ;

public FileHandler(String fileName) throws IOException {
if (fileName == null || fileName.trim().isEmpty()) {
throw new IllegalArgumentException("Имя файла не может быть пустым");
}
this.writer = new BufferedWriter(new FileWriter(fileName, true));
}

@Override
public void publish(String formattedMessage) throws IOException {
if (formattedMessage == null) {
throw new IllegalArgumentException("Сообщение не может быть null");
}
writer.write(formattedMessage);
writer.newLine();
writer.flush();
}

@Override
public void close() throws IOException{
writer.close();
}

}
Loading