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
12 changes: 9 additions & 3 deletions task01/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@
Требования к классу `Logger`:
* Каждому экземпляру класса можно задать имя.
Имя можно получить, вызвав публичный метод `String getName()`.
* В классе должен быть публичный статический метод `getLogger(String name)`, возвращающий экземпляр логгера с указанным именем. Повторый вызов с тем же аргументом должен возвращать тот же самый экземпляр, что и при первом вызове. Если продемонстрировать это кодом, то следующий код должен возвращать true:
* В классе должен быть публичный статический метод `getLogger(String name)`, возвращающий экземпляр логгера с указанным именем.
* Повторый вызов с тем же аргументом должен возвращать тот же самый экземпляр, что и при первом вызове.
* Если продемонстрировать это кодом, то следующий код должен возвращать true:
```
Logger logger1 = Logger.getLogger("test")
Logger logger2 = Logger.getLogger("test")
Expand All @@ -31,9 +33,13 @@ return logger1 == logger2
```
[WARNING] 2018.07.17 09:56:32 myLogger - something weird happened
```
* Для каждого уровня нужно добавить 2 метода. Название методов должно совпадать с уровнем (в нижнем регистре, например, error). Один метод должен принимать в качестве аргумента строку, которая должна быть выведена на экран в качестве *MESSAGE*. Второй метод должен принимать первым параметром шаблон сообщения (в любом формате, например `java.lang.String.format()` или `java.text.MessageFormat.format()` и любым количеством дополнительных аргументов, которые будут использоваться для форматирования переданной строки.
* Для каждого уровня нужно добавить 2 метода. Название методов должно совпадать с уровнем (в нижнем регистре, например, error).
* Один метод должен принимать в качестве аргумента строку, которая должна быть выведена на экран в качестве *MESSAGE*.
* Второй метод должен принимать первым параметром шаблон сообщения (в любом формате, например `java.lang.String.format()` или `java.text.MessageFormat.format()`
* и любым количеством дополнительных аргументов, которые будут использоваться для форматирования переданной строки.

* Добавить два метода с названием `log`, первый из которых принимает на вход два параметра - уровень логгирования и сообщение. Второй - уровень логгирования, шаблон сообщения и любое количество аргументов, которые будут подставлены в шаблон
* Добавить два метода с названием `log`, первый из которых принимает на вход два параметра - уровень логгирования и сообщение.
* Второй - уровень логгирования, шаблон сообщения и любое количество аргументов, которые будут подставлены в шаблон

* `Logger` должен поддерживать динамическое задание текущего уровня важности. Сообщение, чей уровень важности ниже установленного не должны печататься в консоль.

Expand Down
103 changes: 103 additions & 0 deletions task01/src/com/example/task01/Logger.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
package com.example.task01;

import java.util.ArrayList;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class Logger {
private final String name;
private static final ArrayList<Logger> loggers = new ArrayList<>();
private Level level;

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

private static final DateTimeFormatter FORMATTER =
DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss");

private String getCurrentDateTime() {
return LocalDateTime.now().format(FORMATTER);
}


public String getName(){
return name;
}

public Level getLevel(){
return level;
}

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

private Logger(String name, Level level){
this.name = name;
this.level = level;
loggers.add(this);
}

public static Logger getLogger(String name){
for (Logger l : loggers){
if (l.getName().equals(name)) return l;
}
return new Logger(name, Level.DEBUG);
}

public void debug(String message){
log(Level.DEBUG, message);
}

public void debug(String pattern, Object... args){
log(Level.DEBUG, pattern, args);
}

public void info(String message){
log(Level.INFO, message);
}

public void info(String pattern, Object... args){
log(Level.INFO, pattern, args);
}

public void warning(String message){
log(Level.WARNING, message);
}

public void warning(String pattern, Object... args){
log(Level.WARNING, pattern, args);
}

public void error(String message){
log(Level.ERROR, message);
}

public void error(String pattern, Object... args){
log(Level.ERROR, pattern, args);
}

private void printLogMessage(Level level, String message) {
String datetime = getCurrentDateTime();
String logMessage = String.format("[%s] %s %s - %s",
level, datetime, name, message);
System.out.println(logMessage);
}

public void log(Level level, String message){
if (level.ordinal() >= this.level.ordinal()){
printLogMessage(level, message);
}
}

public void log(Level level, String pattern, Object... args){
if (level.ordinal() >= this.level.ordinal()){
String formattedMessage = String.format(pattern, args);
printLogMessage(level, formattedMessage);
}
}
}
19 changes: 18 additions & 1 deletion task01/src/com/example/task01/Task01Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,23 @@

public class Task01Main {
public static void main(String[] args) {
Logger logger1 = Logger.getLogger("test");
Logger logger2 = Logger.getLogger("test");

System.out.println(logger1 == logger2);

logger1.setLevel(Logger.Level.INFO);

logger1.debug("Это сообщение не должно появиться"); // DEBUG < INFO
logger1.info("Информационное сообщение");
logger1.warning("Предупреждение!");
logger1.error("Ошибка!");

logger1.info("Пользователь %s вошел в систему", "Анна");
logger1.warning("Осталось %d попыток", 3);

Logger logger3 = Logger.getLogger("test2");
logger3.setLevel(Logger.Level.DEBUG);
logger3.debug("3 логгер");
}
}
}
18 changes: 18 additions & 0 deletions task02/src/com/example/task02/DiscountBill.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.example.task02;

public class DiscountBill extends Bill{
private final int discount;
public DiscountBill(int discount) {
this.discount = discount;
}
public String getDiscount() {
return discount + "%";
}
public long getAbsoluteDiscount(){
return (long)(super.getPrice() * ((double)discount / 100));
}
@Override
public long getPrice() {
return super.getPrice() - getAbsoluteDiscount();
}
}
33 changes: 18 additions & 15 deletions task02/src/com/example/task02/Task02Main.java
Original file line number Diff line number Diff line change
@@ -1,21 +1,24 @@
package com.example.task02;

public class Task02Main {
public static void main(String[] args) {
// Создаем товары
Item milk = new Item("Молоко", 80);
Item bread = new Item("Хлеб", 40);
Item cheese = new Item("Сыр", 200);

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);
DiscountBill bill = new DiscountBill(20); // Создаем счет со скидкой 20%

bill.add(milk, 2); // 2 * 80 = 160
bill.add(bread, 1); // 1 * 40 = 40
bill.add(cheese, 1); // 1 * 200 = 200
// Итого без скидки: 400

System.out.println("Размер скидки: " + bill.getDiscount());
System.out.println("Абсолютная скидка: " + bill.getAbsoluteDiscount() + " руб.");
System.out.println("Общая сумма со скидкой: " + bill.getPrice());

System.out.println("\n" + bill.toString());
}
}
}
30 changes: 30 additions & 0 deletions task03/src/com/example/task03/Hours.java
Original file line number Diff line number Diff line change
@@ -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 * 60 * 60 * 1000;
}

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

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

@Override
public long toHours() {
return amount;
}
}
6 changes: 4 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,13 @@ public long toMillis() {

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

@Override
public long toMinutes() {
return amount / 1000 * 60;
return Math.round(amount / (1000.0 * 60.0));
}
@Override
public long toHours() { return Math.round(amount / (1000.0 * 60.0 * 60.0)); }
}
19 changes: 11 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,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 / 60.0);
}
}
5 changes: 4 additions & 1 deletion task03/src/com/example/task03/Seconds.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ public long toSeconds() {

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

@Override
public long toHours() { return Math.round(amount / (60.0 * 60.0)); }
}
4 changes: 4 additions & 0 deletions task03/src/com/example/task03/Task03Main.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,15 @@ public class Task03Main {
public static void main(String[] args) {
TimeUnit unit1 = new Seconds(1000);
printTimeUnit(unit1);

TimeUnit hours = new Hours(5);
printTimeUnit(hours);
}

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()));
}
}
2 changes: 2 additions & 0 deletions task03/src/com/example/task03/TimeUnit.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,7 @@ public interface TimeUnit {
* @return количество минут в текущем интервале
*/
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 Minutes toMinutes(Seconds seconds) { return new Minutes(seconds.toMinutes()); }

public static Hours toHours(Minutes minutes) { return new Hours(minutes.toHours()); }
}
3 changes: 2 additions & 1 deletion task04/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@
В качестве конечных обработчиков сообщений нужно реализовать следующие:
* `ConsoleHandler` - обработчик, выводящий сообщения в консоль
* `FileHandler` - обработчик, выводящий сообщения в файл
* `RotationFileHandler` - обработчик, выводящий сообщения в файл с определенной ротацией - например, для каждого часа создается свой файл. Для данного обработчика нужно иметь возможность выставлять интервал ротации (например, с помощью java.time.temporal.ChronoUnit, либо другим удобным способом).
* `RotationFileHandler` - обработчик, выводящий сообщения в файл с определенной ротацией - например, для каждого часа создается свой файл.
* Для данного обработчика нужно иметь возможность выставлять интервал ротации (например, с помощью java.time.temporal.ChronoUnit, либо другим удобным способом).
* `MemoryHandler` - обработчик - прокси, который может аккумулировать сообщения в памяти и при необходимости (явном вызове метода или при достижении определенного объема) отправлять их в проксируемый обработчик.

Например, с помощью данного класса мы должны уметь отправлять сообщения в консоль (или файл), но только определенными "порциями".
Expand Down
8 changes: 8 additions & 0 deletions task04/src/com/example/task04/ConsoleHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.example.task04;

public class ConsoleHandler implements MessageHandler {
@Override
public void handle(String message) {
System.out.println(message);
}
}
23 changes: 23 additions & 0 deletions task04/src/com/example/task04/FileHandler.java
Original file line number Diff line number Diff line change
@@ -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 String fileName;

public FileHandler(String fileName) {
this.fileName = fileName;
}

@Override
public void handle(String message) {
try (BufferedWriter writer = new BufferedWriter(new FileWriter(fileName, true))) {
writer.write(message);
writer.newLine();
} catch (IOException e) {
e.printStackTrace();
}
}
}
8 changes: 8 additions & 0 deletions task04/src/com/example/task04/Level.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.example.task04;

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