From dcdb157c24b81acd24bdbecf3116cae55cac7ffb Mon Sep 17 00:00:00 2001 From: arthur_kuspakov Date: Fri, 1 Mar 2024 20:59:16 +0300 Subject: [PATCH 1/6] Release method split in NumberSample.java and create new class Quantity.java --- .../main/java/ru/msu/vmk/NumberSample.java | 12 ++- basics/src/main/java/ru/msu/vmk/Quantity.java | 102 ++++++++++++++++++ 2 files changed, 110 insertions(+), 4 deletions(-) create mode 100644 basics/src/main/java/ru/msu/vmk/Quantity.java diff --git a/basics/src/main/java/ru/msu/vmk/NumberSample.java b/basics/src/main/java/ru/msu/vmk/NumberSample.java index 9b71909..bbe052b 100644 --- a/basics/src/main/java/ru/msu/vmk/NumberSample.java +++ b/basics/src/main/java/ru/msu/vmk/NumberSample.java @@ -4,9 +4,13 @@ public class NumberSample { public static BigDecimal[] split(BigDecimal amount, int n) { - // разделить amount на n частей - // если остается остаток, прибавить его к первому числу - var array = new BigDecimal[]{}; - return null; + var array = new BigDecimal[n]; + double temp = amount.doubleValue(); + for (int i = 0; n > 0; i++, n--) { + double size = temp / n; + array[i] = BigDecimal.valueOf(size); + temp -= size; + } + return array; } } diff --git a/basics/src/main/java/ru/msu/vmk/Quantity.java b/basics/src/main/java/ru/msu/vmk/Quantity.java new file mode 100644 index 0000000..311a7ab --- /dev/null +++ b/basics/src/main/java/ru/msu/vmk/Quantity.java @@ -0,0 +1,102 @@ +package ru.msu.vmk; + +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Objects; + +public class Quantity { + + private final BigDecimal amount; + private final String currency; + + public Quantity(BigDecimal amount, String currency) { + if (amount == null) { + throw new IllegalArgumentException("amount cannot be null"); + } + if (currency == null || currency.isBlank()) { + throw new IllegalArgumentException("currency cannot be empty"); + } + this.amount = amount.setScale(2, RoundingMode.HALF_EVEN); + this.currency = currency; + } + + public Quantity(String amount, String currency) { + this(new BigDecimal(amount), currency); + } + + public BigDecimal getAmount() { + return amount; + } + + public String getCurrency() { + return currency; + } + + /*** + * Method add amount + * @param quantity - finance object + * @return - new finance object + */ + public Quantity add(Quantity quantity) { + validateCurrenciesAreEqual(quantity); + BigDecimal sum = this.amount.add(quantity.amount); + return new Quantity(sum, this.currency); + } + + /*** + * Method subtract amount + * @param quantity - finance object + * @return - new finance object + */ + public Quantity subtract(Quantity quantity) { + validateCurrenciesAreEqual(quantity); + BigDecimal result = this.amount.subtract(quantity.amount); + return new Quantity(result, this.currency); + } + + /*** + * Method multiply amount + * @param quantity - finance object + * @return - new finance objet + */ + public Quantity multiply(Quantity quantity) { + validateCurrenciesAreEqual(quantity); + BigDecimal result = this.amount.multiply(quantity.amount); + return new Quantity(result, this.currency); + } + + /*** + * Method divide amount by n equals parts + * @param quantity - finance object + * @param n - part segment + * @return - array BigDecimal[] + */ + public BigDecimal[] divide(Quantity quantity, int n) { + validateCurrenciesAreEqual(quantity); + return NumberSample.split(quantity.amount, n); + } + + @Override + public String toString() { + return amount + " " + currency; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Quantity quantity = (Quantity) o; + return amount.equals(quantity.amount) && currency.equals(quantity.currency); + } + + @Override + public int hashCode() { + return Objects.hash(amount, currency); + } + + private void validateCurrenciesAreEqual(Quantity quantity) { + if (!this.currency.equals(quantity.currency)) { + throw new IllegalArgumentException("Валюты не совпадают: " + this.currency + " " + quantity.currency); + } + } +} From 972a14a43f4c96f02ee0aadeea343809e54aa8e8 Mon Sep 17 00:00:00 2001 From: arthur_kuspakov Date: Fri, 1 Mar 2024 22:20:00 +0300 Subject: [PATCH 2/6] Create test class QuantityTest.java --- basics/src/main/java/ru/msu/vmk/Quantity.java | 6 +- .../test/java/ru/msu/vmk/QuantityTest.java | 171 ++++++++++++++++++ 2 files changed, 173 insertions(+), 4 deletions(-) create mode 100644 basics/src/test/java/ru/msu/vmk/QuantityTest.java diff --git a/basics/src/main/java/ru/msu/vmk/Quantity.java b/basics/src/main/java/ru/msu/vmk/Quantity.java index 311a7ab..01a5723 100644 --- a/basics/src/main/java/ru/msu/vmk/Quantity.java +++ b/basics/src/main/java/ru/msu/vmk/Quantity.java @@ -67,13 +67,11 @@ public Quantity multiply(Quantity quantity) { /*** * Method divide amount by n equals parts - * @param quantity - finance object * @param n - part segment * @return - array BigDecimal[] */ - public BigDecimal[] divide(Quantity quantity, int n) { - validateCurrenciesAreEqual(quantity); - return NumberSample.split(quantity.amount, n); + public BigDecimal[] divide(int n) { + return NumberSample.split(this.amount, n); } @Override diff --git a/basics/src/test/java/ru/msu/vmk/QuantityTest.java b/basics/src/test/java/ru/msu/vmk/QuantityTest.java new file mode 100644 index 0000000..1dcb3e3 --- /dev/null +++ b/basics/src/test/java/ru/msu/vmk/QuantityTest.java @@ -0,0 +1,171 @@ +package ru.msu.vmk; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.math.BigDecimal; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.*; + +class QuantityTest { + + @ParameterizedTest + @MethodSource("getQuantityAmount") + void getAmount(Quantity quantity, double expected) { + assertEquals(expected, quantity.getAmount().doubleValue()); + } + + @ParameterizedTest + @MethodSource("getQuantityCurrency") + void getCurrency(Quantity quantity, String expected) { + assertEquals(expected, quantity.getCurrency()); + } + + @ParameterizedTest + @MethodSource("getQuantityAdd") + void add(Quantity quantity1, Quantity quantity2, Quantity expected) { + assertEquals(expected, quantity1.add(quantity2)); + } + + @ParameterizedTest + @MethodSource("getQuantitySubtract") + void subtract(Quantity quantity1, Quantity quantity2, Quantity expected) { + assertEquals(expected, quantity1.subtract(quantity2)); + } + + @ParameterizedTest + @MethodSource("getQuantityMultiply") + void multiply(Quantity quantity1, Quantity quantity2, Quantity expected) { + assertEquals(expected, quantity1.multiply(quantity2)); + } + + @ParameterizedTest + @MethodSource("provideParameters") + void divide(Quantity quantity, int n, BigDecimal[] expected) { + assertArrayEquals(expected, quantity.divide(n)); + } + + @ParameterizedTest + @MethodSource("getQuantityToString") + void testToString(Quantity quantity, String expected) { + assertEquals(expected, quantity.toString()); + } + + @ParameterizedTest + @MethodSource("getQuantityEquals") + void testEquals(Quantity quantity1, Quantity quantity2, boolean expected) { + assertEquals(expected, quantity1.equals(quantity2)); + } + + @ParameterizedTest + @MethodSource("getQuantityHashCode") + void testHashCode(Quantity quantity1, Quantity quantity2, boolean expected) { + assertEquals(expected, quantity1.hashCode() == quantity2.hashCode()); + } + + @ParameterizedTest + @MethodSource("getQuantityErrorCurrency") + void testHashCode(Quantity quantity1, Quantity quantity2, String expected) { + String message = ""; + try { + quantity1.add(quantity2); + } catch (Exception ex){ + message = ex.getMessage(); + } + assertEquals(message, expected); + } + + @Test + void testConstructorCurrencyNull() { + String message = ""; + try { + Quantity quantity = new Quantity("123", ""); + } catch (Exception ex){ + message = ex.getMessage(); + } + assertEquals(message, "currency cannot be empty"); + } + + private static Stream provideParameters() { + return Stream.of( + Arguments.of(new Quantity("0.1", "USD"), 2, new BigDecimal[]{new BigDecimal("0.05"), new BigDecimal("0.05")}), + Arguments.of(new Quantity("1.0", "USD"), 2, new BigDecimal[]{new BigDecimal("0.5"), new BigDecimal("0.5")}), + Arguments.of(new Quantity("2.0", "USD"), 2, new BigDecimal[]{new BigDecimal("1.0"), new BigDecimal("1.0")}), + Arguments.of(new Quantity("5.0", "USD"), 2, new BigDecimal[]{new BigDecimal("2.5"), new BigDecimal("2.5")}), + Arguments.of(new Quantity("10.0", "USD"), 2, new BigDecimal[]{new BigDecimal("5.0"), new BigDecimal("5.0")}) + ); + } + + private static Stream getQuantityAmount() { + return Stream.of( + Arguments.of(new Quantity("1000", "USD"), 1000.0), + Arguments.of(new Quantity("2000", "USD"), 2000.0), + Arguments.of(new Quantity("3000", "RUB"), 3000.0) + ); + } + + private static Stream getQuantityCurrency() { + return Stream.of( + Arguments.of(new Quantity("1000", "USD"), "USD"), + Arguments.of(new Quantity("2000", "USD"), "USD"), + Arguments.of(new Quantity("3000", "RUB"), "RUB") + ); + } + + private static Stream getQuantityToString() { + return Stream.of( + Arguments.of(new Quantity("1000", "USD"), "1000.00 USD"), + Arguments.of(new Quantity("2000", "USD"), "2000.00 USD"), + Arguments.of(new Quantity("3000", "RUB"), "3000.00 RUB") + ); + } + + private static Stream getQuantityAdd() { + return Stream.of( + Arguments.of(new Quantity("1000", "USD"), new Quantity("1000", "USD"), new Quantity("2000", "USD")), + Arguments.of(new Quantity("2000", "USD"), new Quantity("2000", "USD"), new Quantity("4000", "USD")), + Arguments.of(new Quantity("3000", "RUB"), new Quantity("1000", "RUB"), new Quantity("4000", "RUB")) + ); + } + + private static Stream getQuantitySubtract() { + return Stream.of( + Arguments.of(new Quantity("1000", "USD"), new Quantity("1000", "USD"), new Quantity("0", "USD")), + Arguments.of(new Quantity("2000", "USD"), new Quantity("2000", "USD"), new Quantity("0", "USD")), + Arguments.of(new Quantity("3000", "RUB"), new Quantity("1000", "RUB"), new Quantity("2000", "RUB")) + ); + } + + private static Stream getQuantityMultiply() { + return Stream.of( + Arguments.of(new Quantity("1000", "USD"), new Quantity("1000", "USD"), new Quantity("1000000", "USD")), + Arguments.of(new Quantity("2000", "USD"), new Quantity("2000", "USD"), new Quantity("4000000", "USD")), + Arguments.of(new Quantity("3000", "RUB"), new Quantity("1000", "RUB"), new Quantity("3000000", "RUB")) + ); + } + + private static Stream getQuantityEquals() { + return Stream.of( + Arguments.of(new Quantity("1000", "USD"), new Quantity("1000", "USD"), true), + Arguments.of(new Quantity("2000", "USD"), new Quantity("2000", "USD"), true), + Arguments.of(new Quantity("3000", "RUB"), new Quantity("1000", "RUB"), false) + ); + } + + private static Stream getQuantityHashCode() { + return Stream.of( + Arguments.of(new Quantity("1000", "USD"), new Quantity("1000", "USD"), true), + Arguments.of(new Quantity("2000", "USD"), new Quantity("2000", "USD"), true), + Arguments.of(new Quantity("3000", "RUB"), new Quantity("1000", "RUB"), false) + ); + } + + private static Stream getQuantityErrorCurrency() { + return Stream.of( + Arguments.of(new Quantity("1000", "USD"), new Quantity("1000", "RUB"), "Валюты не совпадают: USD RUB") + ); + } +} \ No newline at end of file From 429aa10be2f9e6fba462bc87494cb59da5df43f2 Mon Sep 17 00:00:00 2001 From: arthur_kuspakov Date: Wed, 13 Mar 2024 01:04:22 +0300 Subject: [PATCH 3/6] Create test class QuantityTest.java --- .../main/java/ru/msu/vmk/NumberSample.java | 13 +- basics/src/main/java/ru/msu/vmk/Quantity.java | 100 ---------- .../test/java/ru/msu/vmk/QuantityTest.java | 171 ------------------ .../src/main/java/ru/msu/vmk/LibraryImpl.java | 52 +++++- object-oriented-programming/pom.xml | 6 + .../src/main/java/ru/msu/vmk/Quantity.java | 48 ++++- 6 files changed, 107 insertions(+), 283 deletions(-) delete mode 100644 basics/src/main/java/ru/msu/vmk/Quantity.java delete mode 100644 basics/src/test/java/ru/msu/vmk/QuantityTest.java diff --git a/basics/src/main/java/ru/msu/vmk/NumberSample.java b/basics/src/main/java/ru/msu/vmk/NumberSample.java index bbe052b..858f3d6 100644 --- a/basics/src/main/java/ru/msu/vmk/NumberSample.java +++ b/basics/src/main/java/ru/msu/vmk/NumberSample.java @@ -3,12 +3,23 @@ import java.math.BigDecimal; public class NumberSample { + public static BigDecimal[] split(BigDecimal amount, int n) { var array = new BigDecimal[n]; double temp = amount.doubleValue(); + int previousSize = n; for (int i = 0; n > 0; i++, n--) { double size = temp / n; - array[i] = BigDecimal.valueOf(size); + if(previousSize > 2) { + if (i == 0) { + double ost = temp % n; + array[i] = BigDecimal.valueOf((int) size).add(BigDecimal.valueOf(ost)); + }else { + array[i] = BigDecimal.valueOf((int)size); + } + } else { + array[i] = BigDecimal.valueOf(size); + } temp -= size; } return array; diff --git a/basics/src/main/java/ru/msu/vmk/Quantity.java b/basics/src/main/java/ru/msu/vmk/Quantity.java deleted file mode 100644 index 01a5723..0000000 --- a/basics/src/main/java/ru/msu/vmk/Quantity.java +++ /dev/null @@ -1,100 +0,0 @@ -package ru.msu.vmk; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.util.Objects; - -public class Quantity { - - private final BigDecimal amount; - private final String currency; - - public Quantity(BigDecimal amount, String currency) { - if (amount == null) { - throw new IllegalArgumentException("amount cannot be null"); - } - if (currency == null || currency.isBlank()) { - throw new IllegalArgumentException("currency cannot be empty"); - } - this.amount = amount.setScale(2, RoundingMode.HALF_EVEN); - this.currency = currency; - } - - public Quantity(String amount, String currency) { - this(new BigDecimal(amount), currency); - } - - public BigDecimal getAmount() { - return amount; - } - - public String getCurrency() { - return currency; - } - - /*** - * Method add amount - * @param quantity - finance object - * @return - new finance object - */ - public Quantity add(Quantity quantity) { - validateCurrenciesAreEqual(quantity); - BigDecimal sum = this.amount.add(quantity.amount); - return new Quantity(sum, this.currency); - } - - /*** - * Method subtract amount - * @param quantity - finance object - * @return - new finance object - */ - public Quantity subtract(Quantity quantity) { - validateCurrenciesAreEqual(quantity); - BigDecimal result = this.amount.subtract(quantity.amount); - return new Quantity(result, this.currency); - } - - /*** - * Method multiply amount - * @param quantity - finance object - * @return - new finance objet - */ - public Quantity multiply(Quantity quantity) { - validateCurrenciesAreEqual(quantity); - BigDecimal result = this.amount.multiply(quantity.amount); - return new Quantity(result, this.currency); - } - - /*** - * Method divide amount by n equals parts - * @param n - part segment - * @return - array BigDecimal[] - */ - public BigDecimal[] divide(int n) { - return NumberSample.split(this.amount, n); - } - - @Override - public String toString() { - return amount + " " + currency; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Quantity quantity = (Quantity) o; - return amount.equals(quantity.amount) && currency.equals(quantity.currency); - } - - @Override - public int hashCode() { - return Objects.hash(amount, currency); - } - - private void validateCurrenciesAreEqual(Quantity quantity) { - if (!this.currency.equals(quantity.currency)) { - throw new IllegalArgumentException("Валюты не совпадают: " + this.currency + " " + quantity.currency); - } - } -} diff --git a/basics/src/test/java/ru/msu/vmk/QuantityTest.java b/basics/src/test/java/ru/msu/vmk/QuantityTest.java deleted file mode 100644 index 1dcb3e3..0000000 --- a/basics/src/test/java/ru/msu/vmk/QuantityTest.java +++ /dev/null @@ -1,171 +0,0 @@ -package ru.msu.vmk; - -import org.junit.jupiter.api.Test; -import org.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.Arguments; -import org.junit.jupiter.params.provider.MethodSource; - -import java.math.BigDecimal; -import java.util.stream.Stream; - -import static org.junit.jupiter.api.Assertions.*; - -class QuantityTest { - - @ParameterizedTest - @MethodSource("getQuantityAmount") - void getAmount(Quantity quantity, double expected) { - assertEquals(expected, quantity.getAmount().doubleValue()); - } - - @ParameterizedTest - @MethodSource("getQuantityCurrency") - void getCurrency(Quantity quantity, String expected) { - assertEquals(expected, quantity.getCurrency()); - } - - @ParameterizedTest - @MethodSource("getQuantityAdd") - void add(Quantity quantity1, Quantity quantity2, Quantity expected) { - assertEquals(expected, quantity1.add(quantity2)); - } - - @ParameterizedTest - @MethodSource("getQuantitySubtract") - void subtract(Quantity quantity1, Quantity quantity2, Quantity expected) { - assertEquals(expected, quantity1.subtract(quantity2)); - } - - @ParameterizedTest - @MethodSource("getQuantityMultiply") - void multiply(Quantity quantity1, Quantity quantity2, Quantity expected) { - assertEquals(expected, quantity1.multiply(quantity2)); - } - - @ParameterizedTest - @MethodSource("provideParameters") - void divide(Quantity quantity, int n, BigDecimal[] expected) { - assertArrayEquals(expected, quantity.divide(n)); - } - - @ParameterizedTest - @MethodSource("getQuantityToString") - void testToString(Quantity quantity, String expected) { - assertEquals(expected, quantity.toString()); - } - - @ParameterizedTest - @MethodSource("getQuantityEquals") - void testEquals(Quantity quantity1, Quantity quantity2, boolean expected) { - assertEquals(expected, quantity1.equals(quantity2)); - } - - @ParameterizedTest - @MethodSource("getQuantityHashCode") - void testHashCode(Quantity quantity1, Quantity quantity2, boolean expected) { - assertEquals(expected, quantity1.hashCode() == quantity2.hashCode()); - } - - @ParameterizedTest - @MethodSource("getQuantityErrorCurrency") - void testHashCode(Quantity quantity1, Quantity quantity2, String expected) { - String message = ""; - try { - quantity1.add(quantity2); - } catch (Exception ex){ - message = ex.getMessage(); - } - assertEquals(message, expected); - } - - @Test - void testConstructorCurrencyNull() { - String message = ""; - try { - Quantity quantity = new Quantity("123", ""); - } catch (Exception ex){ - message = ex.getMessage(); - } - assertEquals(message, "currency cannot be empty"); - } - - private static Stream provideParameters() { - return Stream.of( - Arguments.of(new Quantity("0.1", "USD"), 2, new BigDecimal[]{new BigDecimal("0.05"), new BigDecimal("0.05")}), - Arguments.of(new Quantity("1.0", "USD"), 2, new BigDecimal[]{new BigDecimal("0.5"), new BigDecimal("0.5")}), - Arguments.of(new Quantity("2.0", "USD"), 2, new BigDecimal[]{new BigDecimal("1.0"), new BigDecimal("1.0")}), - Arguments.of(new Quantity("5.0", "USD"), 2, new BigDecimal[]{new BigDecimal("2.5"), new BigDecimal("2.5")}), - Arguments.of(new Quantity("10.0", "USD"), 2, new BigDecimal[]{new BigDecimal("5.0"), new BigDecimal("5.0")}) - ); - } - - private static Stream getQuantityAmount() { - return Stream.of( - Arguments.of(new Quantity("1000", "USD"), 1000.0), - Arguments.of(new Quantity("2000", "USD"), 2000.0), - Arguments.of(new Quantity("3000", "RUB"), 3000.0) - ); - } - - private static Stream getQuantityCurrency() { - return Stream.of( - Arguments.of(new Quantity("1000", "USD"), "USD"), - Arguments.of(new Quantity("2000", "USD"), "USD"), - Arguments.of(new Quantity("3000", "RUB"), "RUB") - ); - } - - private static Stream getQuantityToString() { - return Stream.of( - Arguments.of(new Quantity("1000", "USD"), "1000.00 USD"), - Arguments.of(new Quantity("2000", "USD"), "2000.00 USD"), - Arguments.of(new Quantity("3000", "RUB"), "3000.00 RUB") - ); - } - - private static Stream getQuantityAdd() { - return Stream.of( - Arguments.of(new Quantity("1000", "USD"), new Quantity("1000", "USD"), new Quantity("2000", "USD")), - Arguments.of(new Quantity("2000", "USD"), new Quantity("2000", "USD"), new Quantity("4000", "USD")), - Arguments.of(new Quantity("3000", "RUB"), new Quantity("1000", "RUB"), new Quantity("4000", "RUB")) - ); - } - - private static Stream getQuantitySubtract() { - return Stream.of( - Arguments.of(new Quantity("1000", "USD"), new Quantity("1000", "USD"), new Quantity("0", "USD")), - Arguments.of(new Quantity("2000", "USD"), new Quantity("2000", "USD"), new Quantity("0", "USD")), - Arguments.of(new Quantity("3000", "RUB"), new Quantity("1000", "RUB"), new Quantity("2000", "RUB")) - ); - } - - private static Stream getQuantityMultiply() { - return Stream.of( - Arguments.of(new Quantity("1000", "USD"), new Quantity("1000", "USD"), new Quantity("1000000", "USD")), - Arguments.of(new Quantity("2000", "USD"), new Quantity("2000", "USD"), new Quantity("4000000", "USD")), - Arguments.of(new Quantity("3000", "RUB"), new Quantity("1000", "RUB"), new Quantity("3000000", "RUB")) - ); - } - - private static Stream getQuantityEquals() { - return Stream.of( - Arguments.of(new Quantity("1000", "USD"), new Quantity("1000", "USD"), true), - Arguments.of(new Quantity("2000", "USD"), new Quantity("2000", "USD"), true), - Arguments.of(new Quantity("3000", "RUB"), new Quantity("1000", "RUB"), false) - ); - } - - private static Stream getQuantityHashCode() { - return Stream.of( - Arguments.of(new Quantity("1000", "USD"), new Quantity("1000", "USD"), true), - Arguments.of(new Quantity("2000", "USD"), new Quantity("2000", "USD"), true), - Arguments.of(new Quantity("3000", "RUB"), new Quantity("1000", "RUB"), false) - ); - } - - private static Stream getQuantityErrorCurrency() { - return Stream.of( - Arguments.of(new Quantity("1000", "USD"), new Quantity("1000", "RUB"), "Валюты не совпадают: USD RUB") - ); - } -} \ No newline at end of file diff --git a/collections/src/main/java/ru/msu/vmk/LibraryImpl.java b/collections/src/main/java/ru/msu/vmk/LibraryImpl.java index 60162b9..6cdb5df 100644 --- a/collections/src/main/java/ru/msu/vmk/LibraryImpl.java +++ b/collections/src/main/java/ru/msu/vmk/LibraryImpl.java @@ -1,25 +1,67 @@ package ru.msu.vmk; -import java.util.List; +import java.util.*; +import java.util.logging.Logger; public class LibraryImpl implements Library{ + + Logger logger = Logger.getLogger(LibraryImpl.class.getName()); + + private final Map books = new HashMap<>(); + private final Map> studentBook = new HashMap<>(); + @Override public void addNewBook(Book book) { - + if(books.containsKey(book.getTitle())) { + logger.info("Книга уже есть в библиотеке!"); + } else { + books.put(book.getTitle(), book); + logger.info("Книга добавлена."); + } } @Override public void borrowBook(Book book, String student) { - + if(books.containsKey(book.getTitle())) { + Book libraryBook = books.get(book.getTitle()); + books.remove(book.getTitle()); + if (studentBook.containsKey(student)) { + List list = studentBook.get(student); + list.add(libraryBook); + studentBook.put(student, list); + } else { + List list = new ArrayList<>(); + list.add(libraryBook); + studentBook.put(student, list); + } + } else { + logger.info("Книги нет в библиотеки."); + } } @Override public void returnBook(Book book, String student) { - + if(!books.containsKey(book.getTitle())) { + if(studentBook.containsKey(student)){ + List list = studentBook.get(student); + for(Book bookFromStudent : list){ + if(Objects.equals(book.getTitle(), bookFromStudent.getTitle())) { + books.put(bookFromStudent.getTitle(), bookFromStudent); + break; + } + } + list.remove(book); + studentBook.put(student, list); + } else { + logger.info("Студент не найден!"); + } + } else { + logger.info("Книгу уже вернули!"); + } } @Override public List findAvailableBooks() { - return null; + return books.values().stream().toList(); } } diff --git a/object-oriented-programming/pom.xml b/object-oriented-programming/pom.xml index 08c5893..64b3b7d 100644 --- a/object-oriented-programming/pom.xml +++ b/object-oriented-programming/pom.xml @@ -23,6 +23,12 @@ junit-jupiter 5.9.2 + + ru.msu.vmk + basics + 1.0-SNAPSHOT + compile + diff --git a/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java b/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java index 6c1810e..35cc3ff 100644 --- a/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java +++ b/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java @@ -1,6 +1,9 @@ package ru.msu.vmk; import java.math.BigDecimal; +import java.math.RoundingMode; +import java.util.Arrays; +import java.util.concurrent.atomic.AtomicInteger; /** * По примеру класса {@link Money} реализовать класс Quantity: @@ -13,11 +16,23 @@ *
- для проверки работы реализовать функцию main() или Unit-test */ public class Quantity { + + private final BigDecimal amount; + private final String unitOfMeasurement; + /** * @param amount - сумма * @param unitOfMeasurement - единица измерения */ public Quantity(BigDecimal amount, String unitOfMeasurement) { + if (amount == null) { + throw new IllegalArgumentException("amount cannot be null"); + } + if (unitOfMeasurement == null || unitOfMeasurement.isBlank()) { + throw new IllegalArgumentException("currency cannot be empty"); + } + this.amount = amount.setScale(2, RoundingMode.HALF_EVEN); + this.unitOfMeasurement = unitOfMeasurement; } /** @@ -25,7 +40,7 @@ public Quantity(BigDecimal amount, String unitOfMeasurement) { * @return {@link Quantity#amount} */ public BigDecimal getAmount() { - return null; + return amount; } /** @@ -35,7 +50,9 @@ public BigDecimal getAmount() { * @return сумма чисел */ public Quantity add(Quantity quantity) throws Exception { - return null; + validateCurrenciesAreEqual(quantity); + BigDecimal sum = this.amount.add(quantity.amount); + return new Quantity(sum, this.unitOfMeasurement); } /** @@ -45,7 +62,9 @@ public Quantity add(Quantity quantity) throws Exception { * @return разность чисел */ public Quantity subtract(Quantity quantity) throws Exception { - return null; + validateCurrenciesAreEqual(quantity); + BigDecimal result = this.amount.subtract(quantity.amount); + return new Quantity(result, this.unitOfMeasurement); } /** @@ -55,7 +74,9 @@ public Quantity subtract(Quantity quantity) throws Exception { * @return произведение */ public Quantity multiply(Quantity quantity) throws Exception { - return null; + validateCurrenciesAreEqual(quantity); + BigDecimal result = this.amount.multiply(quantity.amount); + return new Quantity(result, this.unitOfMeasurement); } /** @@ -65,7 +86,9 @@ public Quantity multiply(Quantity quantity) throws Exception { * @return частное */ public Quantity divide(Quantity quantity) throws Exception { - return null; + validateCurrenciesAreEqual(quantity); + BigDecimal result = this.amount.divide(quantity.amount, RoundingMode.HALF_EVEN); + return new Quantity(result, this.unitOfMeasurement); } /** @@ -75,6 +98,19 @@ public Quantity divide(Quantity quantity) throws Exception { * @return равные части числа */ public Quantity[] divide(int n) throws Exception { - return null; + Quantity[] out = new Quantity[n]; + AtomicInteger idx = new AtomicInteger(); + Arrays.stream(NumberSample.split(this.amount, n)).forEach(bigDecimal -> { + Quantity quantity = new Quantity(bigDecimal, this.unitOfMeasurement); + out[idx.get()] = quantity; + idx.getAndIncrement(); + }); + return out; + } + + private void validateCurrenciesAreEqual(Quantity quantity) { + if (!this.unitOfMeasurement.equals(quantity.unitOfMeasurement)) { + throw new IllegalArgumentException("Валюты не совпадают: " + this.unitOfMeasurement + " " + quantity.unitOfMeasurement); + } } } From 29a0c1dbf8e0e964140793701ba3c92d1086eec2 Mon Sep 17 00:00:00 2001 From: arthur_kuspakov Date: Wed, 13 Mar 2024 01:09:55 +0300 Subject: [PATCH 4/6] Create test class QuantityTest.java --- collections/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/collections/pom.xml b/collections/pom.xml index b822cac..38c543e 100644 --- a/collections/pom.xml +++ b/collections/pom.xml @@ -29,6 +29,12 @@ 5.10.1 test + + org.junit.platform + junit-platform-launcher + 1.9.3 + test + From 6a6f8f7eea5990c47ccbaa8b4eb7c113e296c6b2 Mon Sep 17 00:00:00 2001 From: arthur_kuspakov Date: Wed, 13 Mar 2024 21:11:04 +0300 Subject: [PATCH 5/6] Change code by recommendation --- basics/src/main/java/ru/msu/vmk/NumberSample.java | 14 ++++++-------- .../src/main/java/ru/msu/vmk/LibraryImpl.java | 10 ++++------ .../src/main/java/ru/msu/vmk/Quantity.java | 9 +-------- 3 files changed, 11 insertions(+), 22 deletions(-) diff --git a/basics/src/main/java/ru/msu/vmk/NumberSample.java b/basics/src/main/java/ru/msu/vmk/NumberSample.java index 858f3d6..d70211c 100644 --- a/basics/src/main/java/ru/msu/vmk/NumberSample.java +++ b/basics/src/main/java/ru/msu/vmk/NumberSample.java @@ -10,18 +10,16 @@ public static BigDecimal[] split(BigDecimal amount, int n) { int previousSize = n; for (int i = 0; n > 0; i++, n--) { double size = temp / n; - if(previousSize > 2) { - if (i == 0) { - double ost = temp % n; - array[i] = BigDecimal.valueOf((int) size).add(BigDecimal.valueOf(ost)); - }else { - array[i] = BigDecimal.valueOf((int)size); - } + if (previousSize > 2) { + array[i] = BigDecimal.valueOf((int) size); } else { - array[i] = BigDecimal.valueOf(size); + array[i] = BigDecimal.valueOf(size); } temp -= size; } + if (previousSize > 2) { + array[0] = BigDecimal.valueOf((int) (amount.doubleValue() / previousSize)).add(BigDecimal.valueOf(amount.doubleValue() % previousSize)); + } return array; } } diff --git a/collections/src/main/java/ru/msu/vmk/LibraryImpl.java b/collections/src/main/java/ru/msu/vmk/LibraryImpl.java index 6cdb5df..538a3c0 100644 --- a/collections/src/main/java/ru/msu/vmk/LibraryImpl.java +++ b/collections/src/main/java/ru/msu/vmk/LibraryImpl.java @@ -44,13 +44,11 @@ public void returnBook(Book book, String student) { if(!books.containsKey(book.getTitle())) { if(studentBook.containsKey(student)){ List list = studentBook.get(student); - for(Book bookFromStudent : list){ - if(Objects.equals(book.getTitle(), bookFromStudent.getTitle())) { - books.put(bookFromStudent.getTitle(), bookFromStudent); - break; - } + Book bookFromStudent = list.stream().filter(b -> b.getTitle().equals(book.getTitle())).findFirst().orElse(null); + if(bookFromStudent != null) { + books.put(bookFromStudent.getTitle(), bookFromStudent); + list.remove(book); } - list.remove(book); studentBook.put(student, list); } else { logger.info("Студент не найден!"); diff --git a/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java b/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java index 35cc3ff..ea1b336 100644 --- a/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java +++ b/object-oriented-programming/src/main/java/ru/msu/vmk/Quantity.java @@ -98,14 +98,7 @@ public Quantity divide(Quantity quantity) throws Exception { * @return равные части числа */ public Quantity[] divide(int n) throws Exception { - Quantity[] out = new Quantity[n]; - AtomicInteger idx = new AtomicInteger(); - Arrays.stream(NumberSample.split(this.amount, n)).forEach(bigDecimal -> { - Quantity quantity = new Quantity(bigDecimal, this.unitOfMeasurement); - out[idx.get()] = quantity; - idx.getAndIncrement(); - }); - return out; + return Arrays.stream(NumberSample.split(this.amount, n)).map(bigDecimal -> new Quantity(bigDecimal, this.unitOfMeasurement)).toArray(Quantity[]::new); } private void validateCurrenciesAreEqual(Quantity quantity) { From e173a23d7b7934652c866fb73cbb5a47e3759667 Mon Sep 17 00:00:00 2001 From: arthur_kuspakov Date: Sun, 17 Mar 2024 22:58:42 +0300 Subject: [PATCH 6/6] Home work 4 --- collections/pom.xml | 10 + .../src/main/java/ru/msu/vmk/Book.java | 42 +++ .../src/main/java/ru/msu/vmk/Library.java | 34 ++- .../src/main/java/ru/msu/vmk/LibraryImpl.java | 245 +++++++++++++++--- .../src/main/java/ru/msu/vmk/Main.java | 132 ++++++---- .../src/main/java/ru/msu/vmk/Relation.java | 50 ++++ .../src/main/java/ru/msu/vmk/Student.java | 45 ++++ .../src/test/java/LibraryImplTest.java | 27 +- 8 files changed, 488 insertions(+), 97 deletions(-) create mode 100644 collections/src/main/java/ru/msu/vmk/Relation.java create mode 100644 collections/src/main/java/ru/msu/vmk/Student.java diff --git a/collections/pom.xml b/collections/pom.xml index 38c543e..783d897 100644 --- a/collections/pom.xml +++ b/collections/pom.xml @@ -23,6 +23,16 @@ junit-jupiter 5.9.2 + + org.apache.derby + derby + 10.14.2.0 + + + org.apache.derby + derbynet + 10.6.2.1 + org.junit.jupiter junit-jupiter-api diff --git a/collections/src/main/java/ru/msu/vmk/Book.java b/collections/src/main/java/ru/msu/vmk/Book.java index f2af0e5..4e0b36f 100644 --- a/collections/src/main/java/ru/msu/vmk/Book.java +++ b/collections/src/main/java/ru/msu/vmk/Book.java @@ -1,13 +1,55 @@ package ru.msu.vmk; +import java.util.Objects; + public class Book { + + private int bookId; private String title; + private int isReserved; + + public Book() { + } + public Book(String title){ this.title = title; } + public int getBookId() { + return bookId; + } + + public void setBookId(int bookId) { + this.bookId = bookId; + } + public String getTitle(){ return title; } + + public void setTitle(String title) { + this.title = title; + } + + public int getIsReserved() { + return isReserved; + } + + public void setIsReserved(int isReserved) { + this.isReserved = isReserved; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Book book = (Book) o; + return bookId == book.bookId && isReserved == book.isReserved && Objects.equals(title, book.title); + } + + @Override + public int hashCode() { + return Objects.hash(bookId, title, isReserved); + } } diff --git a/collections/src/main/java/ru/msu/vmk/Library.java b/collections/src/main/java/ru/msu/vmk/Library.java index b5e3b9b..82701a3 100644 --- a/collections/src/main/java/ru/msu/vmk/Library.java +++ b/collections/src/main/java/ru/msu/vmk/Library.java @@ -1,15 +1,41 @@ package ru.msu.vmk; +import java.sql.Connection; +import java.sql.SQLException; import java.util.List; /* Институтская библиотека */ public interface Library { /* Регистрация новой книги */ - void addNewBook(Book book); + void addNewBook(Book book) throws SQLException; + /* Студент берет книгу */ - void borrowBook(Book book, String student); + void borrowBook(Book book, String student) throws SQLException; + /* Студент возвращает книгу */ - void returnBook(Book book, String student); + void returnBook(Book book, String student) throws SQLException; + /* Получить список свободных книг */ - List findAvailableBooks(); + List findAvailableBooks() throws SQLException; + /*Инициализация базы данных*/ + void init() throws SQLException; + + Connection getConnection() throws SQLException; + + Book getBookByTitle(String title) throws SQLException; + + void updateIsReservedFlag(int bookId, int isReserved) throws SQLException; + + Student getStudentByName(String name) throws SQLException; + + List getRelationByStudentId(int studentId) throws SQLException; + + void insertNewStudent(String student) throws SQLException; + + void insertNewRelation(int bookId, int studentId) throws SQLException; + + boolean deleteRelation(int relationId) throws SQLException; + + + } diff --git a/collections/src/main/java/ru/msu/vmk/LibraryImpl.java b/collections/src/main/java/ru/msu/vmk/LibraryImpl.java index 538a3c0..5e28963 100644 --- a/collections/src/main/java/ru/msu/vmk/LibraryImpl.java +++ b/collections/src/main/java/ru/msu/vmk/LibraryImpl.java @@ -1,65 +1,240 @@ package ru.msu.vmk; -import java.util.*; +import java.sql.*; +import java.util.ArrayList; +import java.util.List; import java.util.logging.Logger; -public class LibraryImpl implements Library{ +public class LibraryImpl implements Library { - Logger logger = Logger.getLogger(LibraryImpl.class.getName()); + private final Logger logger = Logger.getLogger(LibraryImpl.class.getName()); - private final Map books = new HashMap<>(); - private final Map> studentBook = new HashMap<>(); + private final String jdbcUrl; + private final String user; + private final String password; + + public LibraryImpl(String jdbcUrl, String user, String password) { + this.jdbcUrl = jdbcUrl; + this.user = user; + this.password = password; + } @Override - public void addNewBook(Book book) { - if(books.containsKey(book.getTitle())) { - logger.info("Книга уже есть в библиотеке!"); + public void addNewBook(Book book) throws SQLException { + Book bookInLibrary = getBookByTitle(book.getTitle()); + if (bookInLibrary == null) { + String sql = "insert into LIBRARY.BOOK (TITLE, IS_RESERVED) values (?,?)"; + try (Connection connection = getConnection(); PreparedStatement pr = connection.prepareStatement(sql)) { + pr.setString(1, book.getTitle()); + pr.setInt(2, 0); + int row = pr.executeUpdate(); + if (row > 0) { + logger.info("Книга добавлена."); + } + } } else { - books.put(book.getTitle(), book); - logger.info("Книга добавлена."); + logger.info("Книга уже есть в библиотеке!"); } } @Override - public void borrowBook(Book book, String student) { - if(books.containsKey(book.getTitle())) { - Book libraryBook = books.get(book.getTitle()); - books.remove(book.getTitle()); - if (studentBook.containsKey(student)) { - List list = studentBook.get(student); - list.add(libraryBook); - studentBook.put(student, list); + public void borrowBook(Book book, String student) throws SQLException { + Book bookInLibrary = getBookByTitle(book.getTitle()); + if (bookInLibrary != null && bookInLibrary.getIsReserved() != 1) { + updateIsReservedFlag(bookInLibrary.getBookId(), 1); + Student studentInDB = getStudentByName(student); + if (studentInDB == null) { + insertNewStudent(student); + studentInDB = getStudentByName(student); + } + List relations = getRelationByStudentId(studentInDB.getStudentId()); + if (!relations.isEmpty()) { + if (relations.stream().anyMatch(rel -> rel.getBookId() != bookInLibrary.getBookId())) { + insertNewRelation(bookInLibrary.getBookId(), studentInDB.getStudentId()); + } } else { - List list = new ArrayList<>(); - list.add(libraryBook); - studentBook.put(student, list); + insertNewRelation(bookInLibrary.getBookId(), studentInDB.getStudentId()); } + logger.info("Книга выдана."); } else { logger.info("Книги нет в библиотеки."); } } @Override - public void returnBook(Book book, String student) { - if(!books.containsKey(book.getTitle())) { - if(studentBook.containsKey(student)){ - List list = studentBook.get(student); - Book bookFromStudent = list.stream().filter(b -> b.getTitle().equals(book.getTitle())).findFirst().orElse(null); - if(bookFromStudent != null) { - books.put(bookFromStudent.getTitle(), bookFromStudent); - list.remove(book); - } - studentBook.put(student, list); + public void returnBook(Book book, String student) throws SQLException { + Student studentInDB = getStudentByName(student); + if (studentInDB != null) { + List relations = getRelationByStudentId(studentInDB.getStudentId()); + if (!relations.isEmpty()) { + relations.stream().filter(rel -> rel.getBookId() == book.getBookId()).forEach(relation -> { + try { + updateIsReservedFlag(relation.getBookId(), 0); + deleteRelation(relation.getRelationId()); + logger.info("Книгу вернули."); + } catch (SQLException e) { + logger.severe(e.getMessage()); + } + }); } else { - logger.info("Студент не найден!"); + logger.info("За студентом не числится эта книга!"); } } else { - logger.info("Книгу уже вернули!"); + logger.info("Студент не найден!"); + } + } + + @Override + public List findAvailableBooks() throws SQLException { + List out = new ArrayList<>(); + String sql = "select * from LIBRARY.BOOK where is_reserved = 0"; + try (Connection connection = getConnection(); PreparedStatement pr = connection.prepareStatement(sql)) { + ResultSet resultSet = pr.executeQuery(); + while (resultSet.next()) { + Book book = new Book(); + book.setBookId(resultSet.getInt("BOOK_ID")); + book.setTitle(resultSet.getString("TITLE")); + book.setIsReserved(resultSet.getInt("IS_RESERVED")); + out.add(book); + } } + return out; } @Override - public List findAvailableBooks() { - return books.values().stream().toList(); + public void init() throws SQLException { + try (Statement stmt = getConnection().createStatement()) { + stmt.execute("create schema LIBRARY"); + stmt.execute("set schema LIBRARY"); + stmt.execute("CREATE TABLE LIBRARY.BOOK " + + " (BOOK_ID INT NOT NULL GENERATED ALWAYS AS IDENTITY " + + " (START WITH 1, INCREMENT BY 1), TITLE VARCHAR(1000), IS_RESERVED INT)"); + stmt.execute("CREATE TABLE LIBRARY.STUDENT " + + " (STUDENT_ID INT NOT NULL GENERATED ALWAYS AS IDENTITY " + + " (START WITH 1, INCREMENT BY 1), NAME VARCHAR(100))"); + stmt.execute("CREATE TABLE LIBRARY.RELATION " + + " (RELATION_ID INT NOT NULL GENERATED ALWAYS AS IDENTITY " + + " (START WITH 1, INCREMENT BY 1), STUDENT_ID INT NOT NULL, BOOK_ID INT NOT NULL)"); + } + } + + @Override + public Connection getConnection() throws SQLException { + return DriverManager.getConnection(jdbcUrl, user, password); + } + + @Override + public Book getBookByTitle(String title) throws SQLException { + Book out = null; + String sql = "select * from LIBRARY.BOOK where title = ?"; + try (Connection connection = getConnection(); PreparedStatement pr = connection.prepareStatement(sql)) { + pr.setString(1, title); + ResultSet resultSet = pr.executeQuery(); + while (resultSet.next()) { + out = new Book(); + out.setBookId(resultSet.getInt("BOOK_ID")); + out.setTitle(resultSet.getString("TITLE")); + out.setIsReserved(resultSet.getInt("IS_RESERVED")); + } + } + return out; + } + + @Override + public void updateIsReservedFlag(int bookId, int isReserved) throws SQLException { + String sql = "update LIBRARY.BOOK set is_reserved = ? where book_id = ?"; + try (Connection connection = getConnection(); PreparedStatement pr = connection.prepareStatement(sql)) { + pr.setInt(1, isReserved); + pr.setInt(2, bookId); + pr.executeUpdate(); + } + } + + @Override + public Student getStudentByName(String name) throws SQLException { + Student out = null; + String sql = "select * from LIBRARY.STUDENT where name = ?"; + try (Connection connection = getConnection(); PreparedStatement pr = connection.prepareStatement(sql)) { + pr.setString(1, name); + ResultSet resultSet = pr.executeQuery(); + while (resultSet.next()) { + out = new Student(); + out.setStudentId(resultSet.getInt("STUDENT_ID")); + out.setStudentName(resultSet.getString("NAME")); + } + } + return out; + } + + @Override + public List getRelationByStudentId(int studentId) throws SQLException { + List out = new ArrayList<>(); + String sql = "select * from LIBRARY.RELATION where student_id = ?"; + try (Connection connection = getConnection(); PreparedStatement pr = connection.prepareStatement(sql)) { + pr.setInt(1, studentId); + ResultSet resultSet = pr.executeQuery(); + while (resultSet.next()) { + Relation relation = new Relation(); + relation.setRelationId(resultSet.getInt("RELATION_ID")); + relation.setStudentId(resultSet.getInt("STUDENT_ID")); + relation.setBookId(resultSet.getInt("BOOK_ID")); + out.add(relation); + } + } + return out; + } + + @Override + public void insertNewStudent(String student) throws SQLException { + String sql = "insert into LIBRARY.STUDENT (NAME) " + + "values (?)"; + try (Connection connection = getConnection()) { + connection.setAutoCommit(false); + try (PreparedStatement pr = connection.prepareStatement(sql)) { + pr.setString(1, student); + pr.execute(); + connection.commit(); + } catch (SQLException e) { + logger.severe(e.getMessage()); + getConnection().rollback(); + } + } + } + + @Override + public void insertNewRelation(int bookId, int studentId) throws SQLException { + String sql = "insert into LIBRARY.RELATION (STUDENT_ID, BOOK_ID) " + + "values (?, ?)"; + try (Connection connection = getConnection()) { + connection.setAutoCommit(false); + try (PreparedStatement pr = connection.prepareStatement(sql)) { + pr.setInt(1, studentId); + pr.setInt(2, bookId); + pr.execute(); + connection.commit(); + } catch (SQLException e) { + logger.severe(e.getMessage()); + getConnection().rollback(); + } + } + } + + @Override + public boolean deleteRelation(int relationId) throws SQLException { + boolean flag = false; + String sql = "delete from LIBRARY.RELATION where relation_id = ?"; + try (Connection connection = getConnection()) { + try (PreparedStatement pr = connection.prepareStatement(sql)) { + pr.setInt(1, relationId); + int row = pr.executeUpdate(); + if (row > 0) { + flag = true; + } + } catch (SQLException e) { + logger.severe(e.getMessage()); + getConnection().rollback(); + } + } + return flag; } } diff --git a/collections/src/main/java/ru/msu/vmk/Main.java b/collections/src/main/java/ru/msu/vmk/Main.java index 50c42f1..b7d74fe 100644 --- a/collections/src/main/java/ru/msu/vmk/Main.java +++ b/collections/src/main/java/ru/msu/vmk/Main.java @@ -1,62 +1,88 @@ package ru.msu.vmk; +import org.apache.derby.drda.NetworkServerControl; + +import java.io.PrintWriter; +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.sql.*; import java.util.*; public class Main { - public static void main(String[] args) { - var set = new HashSet(); - - set.add("test"); - set.add("test1"); - - for (var element: set){ - // System.out.println(element); - } - - var map = new HashMap(); - - map.putIfAbsent(1, "test1"); - map.putIfAbsent(1, "test3"); - map.putIfAbsent(2, "test2"); - - - for (var key: map.keySet()){ - System.out.println("key=" + key + " value=" + map.get(key)); - } - - var array = new ArrayList(); - - array.add("first"); - array.add("second"); - array.add("third"); - - array.add(1, "modified"); - System.out.println(array.set(1, "modified1")); - - for (var element: array){ - System.out.println("index = " + array.indexOf(element) + " element =" + element); - } - - var deque = new ArrayDeque(); - - deque.offer("first"); - deque.offer("second"); - deque.offer("third"); - - while (!deque.isEmpty()){ - var element = deque.removeLast(); - System.out.println(element); + public static void main(String[] args) throws Exception { +// var set = new HashSet(); +// +// set.add("test"); +// set.add("test1"); +// +// for (var element: set){ +// // System.out.println(element); +// } +// +// var map = new HashMap(); +// +// map.putIfAbsent(1, "test1"); +// map.putIfAbsent(1, "test3"); +// map.putIfAbsent(2, "test2"); +// +// +// for (var key: map.keySet()){ +// System.out.println("key=" + key + " value=" + map.get(key)); +// } +// +// var array = new ArrayList(); +// +// array.add("first"); +// array.add("second"); +// array.add("third"); +// +// array.add(1, "modified"); +// System.out.println(array.set(1, "modified1")); +// +// for (var element: array){ +// System.out.println("index = " + array.indexOf(element) + " element =" + element); +// } +// +// var deque = new ArrayDeque(); +// +// deque.offer("first"); +// deque.offer("second"); +// deque.offer("third"); +// +// while (!deque.isEmpty()){ +// var element = deque.removeLast(); +// System.out.println(element); +// } +// +// var stack = new Stack(); +// +// stack.push("first"); +// stack.push("second"); +// stack.push("third"); +// +// while (!stack.isEmpty()){ +// var element = stack.pop(); +// System.out.println(element); +// } + + Library library = new LibraryImpl("jdbc:derby:memory:testdb;create=true", "test", "test"); + library.init(); + + NetworkServerControl nsc = new NetworkServerControl(InetAddress.getByName("localhost"), 1527); + nsc.start(new PrintWriter(System.out, true)); + + Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); + + Connection c = DriverManager.getConnection("jdbc:derby:memory:testdb;create=true"); + try(Connection conn = c; + PreparedStatement ps = conn.prepareStatement("create schema TEST");) { + + boolean success = ps.execute(); + System.out.println("Memory database created: " + success); + + } catch (SQLException e) { + e.printStackTrace(); } - var stack = new Stack(); - - stack.push("first"); - stack.push("second"); - stack.push("third"); - - while (!stack.isEmpty()){ - var element = stack.pop(); - System.out.println(element); - } } } \ No newline at end of file diff --git a/collections/src/main/java/ru/msu/vmk/Relation.java b/collections/src/main/java/ru/msu/vmk/Relation.java new file mode 100644 index 0000000..aaaa608 --- /dev/null +++ b/collections/src/main/java/ru/msu/vmk/Relation.java @@ -0,0 +1,50 @@ +package ru.msu.vmk; + +import java.util.Objects; + +public class Relation { + + private int relationId; + private int bookId; + private int studentId; + + public Relation() { + } + + public int getRelationId() { + return relationId; + } + + public void setRelationId(int relationId) { + this.relationId = relationId; + } + + public int getBookId(){ + return bookId; + } + + public void setBookId(int bookId) { + this.bookId = bookId; + } + + public int getStudentId() { + return studentId; + } + + public void setStudentId(int studentId) { + this.studentId = studentId; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Relation relation = (Relation) o; + return relationId == relation.relationId && bookId == relation.bookId && studentId == relation.studentId; + } + + @Override + public int hashCode() { + return Objects.hash(relationId, bookId, studentId); + } +} diff --git a/collections/src/main/java/ru/msu/vmk/Student.java b/collections/src/main/java/ru/msu/vmk/Student.java new file mode 100644 index 0000000..e0514e6 --- /dev/null +++ b/collections/src/main/java/ru/msu/vmk/Student.java @@ -0,0 +1,45 @@ +package ru.msu.vmk; + +import java.util.Objects; + +public class Student { + + private int studentId; + private String studentName; + + public Student() { + } + + public Student(String studentName){ + this.studentName = studentName; + } + + public int getStudentId() { + return studentId; + } + + public void setStudentId(int studentId) { + this.studentId = studentId; + } + + public String getStudentName(){ + return studentName; + } + + public void setStudentName(String studentName) { + this.studentName = studentName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Student book = (Student) o; + return studentId == book.studentId && Objects.equals(studentName, book.studentName); + } + + @Override + public int hashCode() { + return Objects.hash(studentId, studentName); + } +} diff --git a/collections/src/test/java/LibraryImplTest.java b/collections/src/test/java/LibraryImplTest.java index 518072c..bde8a68 100644 --- a/collections/src/test/java/LibraryImplTest.java +++ b/collections/src/test/java/LibraryImplTest.java @@ -1,12 +1,29 @@ +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import ru.msu.vmk.Book; +import ru.msu.vmk.Library; import ru.msu.vmk.LibraryImpl; -import org.junit.jupiter.api.Assertions; + +import java.sql.SQLException; public class LibraryImplTest { + + private static boolean setUpIsDone = false; + private Library library; + + @BeforeEach + public void init() throws SQLException { + library = new LibraryImpl("jdbc:derby:memory:testdb;create=true", "test", "test"); + if (setUpIsDone) { + return; + } + library.init(); + setUpIsDone = true; + } + @Test - public void addBookTest(){ - var library = new LibraryImpl(); + public void addBookTest() throws SQLException { library.addNewBook(new Book("book")); var availableBooks = library.findAvailableBooks(); @@ -15,11 +32,11 @@ public void addBookTest(){ } @Test - public void borrowAndReturnBookTest(){ - var library = new LibraryImpl(); + public void borrowAndReturnBookTest() throws SQLException { var book = new Book("book"); library.addNewBook(book); + book = library.getBookByTitle(book.getTitle()); var availableBooks = library.findAvailableBooks(); Assertions.assertEquals(1, availableBooks.size());