diff --git a/module01/pom.xml b/module01/pom.xml index 932df7e3..181f9a5f 100644 --- a/module01/pom.xml +++ b/module01/pom.xml @@ -14,6 +14,39 @@ UTF-8 + 11 + 11 + 5.9.2 + 5.5.0 + 5.3.1 + 3.24.2 + + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + test + + + org.mockito + mockito-core + ${mockito.version} + test + + + + org.mockito + mockito-junit-jupiter + ${mockito.junit.version} + test + + + org.assertj + assertj-core + ${assertj.version} + + + diff --git a/module01/src/main/java/ru/sberbank/edu/GCD.java b/module01/src/main/java/ru/sberbank/edu/GCD.java new file mode 100644 index 00000000..77e818e8 --- /dev/null +++ b/module01/src/main/java/ru/sberbank/edu/GCD.java @@ -0,0 +1,22 @@ +package ru.sberbank.edu; + +/*** + * В данном методе мы всегда ставим на первое место наибольшее число + * в последствии ищем наибольший делитель путём деления + */ +public class GCD implements CommonDivisor { + @Override + public int getDivisor(int firstNumber, int secondNumber) { + + if (firstNumber < secondNumber){ + firstNumber = secondNumber * firstNumber; + secondNumber = firstNumber / secondNumber; + firstNumber = firstNumber / secondNumber; + } + + if (secondNumber == 0) { + return firstNumber; + } + return getDivisor(secondNumber, firstNumber % secondNumber); + } +} diff --git a/module01/src/main/java/ru/sberbank/edu/GreetingImpl.java b/module01/src/main/java/ru/sberbank/edu/GreetingImpl.java new file mode 100644 index 00000000..74032b7b --- /dev/null +++ b/module01/src/main/java/ru/sberbank/edu/GreetingImpl.java @@ -0,0 +1,19 @@ +package ru.sberbank.edu; + +public class GreetingImpl implements Greeting { + /*** + * В данном методе мы всегда выводим как лучшее хобби Водный туризм + */ + public void main(String[] args) { + + System.out.println(getBestHobby()); + + } + + @Override + public String getBestHobby() { + + return "Водный туризм"; + + } +} diff --git a/module01/src/test/java/ru/sberbank/edu/GreetingImplTest.java b/module01/src/test/java/ru/sberbank/edu/GreetingImplTest.java new file mode 100644 index 00000000..5ac9721e --- /dev/null +++ b/module01/src/test/java/ru/sberbank/edu/GreetingImplTest.java @@ -0,0 +1,19 @@ +package ru.sberbank.edu; + +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +class GreetingImplTest { + + + + @Test + void main() { + } + + @Test + void getBestHobby() { + GreetingImpl greeting = new GreetingImpl(); + Assertions.assertThat(greeting.getBestHobby()).isEqualTo("Водный туризм"); + } +} \ No newline at end of file diff --git a/module02/input.txt b/module02/input.txt new file mode 100644 index 00000000..5a062717 --- /dev/null +++ b/module02/input.txt @@ -0,0 +1,3 @@ +Мы добавляем первую базовую строку +Мы добавляем вторую базовую строку +Мы добавляем третью базовую строку, но чтуь чуть подлинее diff --git a/module02/output.txt b/module02/output.txt new file mode 100644 index 00000000..caf762c3 --- /dev/null +++ b/module02/output.txt @@ -0,0 +1,3 @@ +В данном файле строк 3 +В данном файле пробелов 16 +Самая длинная строка в файле 'Мы добавляем третью базовую строку, но чтуь чуть подлинее' diff --git a/module02/pom.xml b/module02/pom.xml index 45e842be..c772e5f4 100644 --- a/module02/pom.xml +++ b/module02/pom.xml @@ -14,6 +14,39 @@ UTF-8 + 11 + 11 + 5.9.2 + 5.5.0 + 5.3.1 + 3.24.2 - + + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + test + + + org.mockito + mockito-core + ${mockito.version} + test + + + + org.mockito + mockito-junit-jupiter + ${mockito.junit.version} + test + + + org.assertj + assertj-core + ${assertj.version} + + + + \ No newline at end of file diff --git a/module02/src/main/java/ru/sberbank/edu/App.java b/module02/src/main/java/ru/sberbank/edu/App.java index 5419c026..2dba76f9 100644 --- a/module02/src/main/java/ru/sberbank/edu/App.java +++ b/module02/src/main/java/ru/sberbank/edu/App.java @@ -1,13 +1,16 @@ package ru.sberbank.edu; +import java.io.IOException; + /** * Hello world! * */ -public class App +public class App { - public static void main( String[] args ) - { - System.out.println( "Hello World!" ); + public static void main( String[] args ) throws IOException { + + StatisticImpl main = new StatisticImpl(); + main.start(); } -} +} \ No newline at end of file diff --git a/module02/src/main/java/ru/sberbank/edu/Statistic.java b/module02/src/main/java/ru/sberbank/edu/Statistic.java index 49ef9698..7f7b88ad 100644 --- a/module02/src/main/java/ru/sberbank/edu/Statistic.java +++ b/module02/src/main/java/ru/sberbank/edu/Statistic.java @@ -1,11 +1,16 @@ package ru.sberbank.edu; +import java.io.IOException; + // интерфейс можно менять public interface Statistic { - - int getLineCount(); int getSpaceCount(); + int getLinesCount(); String getLongestLine(); - void save(int lineCount, int spaceCount, String line); + void save(int lineCount, int spaceCount, String line) throws IOException; + void setLineCount(); + + void setSpaceCount(); -} + void setLongestLine(String longestLine); +} \ No newline at end of file diff --git a/module02/src/main/java/ru/sberbank/edu/StatisticImpl.java b/module02/src/main/java/ru/sberbank/edu/StatisticImpl.java new file mode 100644 index 00000000..1eb803df --- /dev/null +++ b/module02/src/main/java/ru/sberbank/edu/StatisticImpl.java @@ -0,0 +1,101 @@ +package ru.sberbank.edu; + +import java.io.*; + +public class StatisticImpl implements Statistic{ + private int spaceCount; + private int lineCount; + private String longestLine; + private static char SPACE = ' '; + public void start() throws IOException { + + File inputFile = new File("input.txt"); + BufferedReader inputReader; + FileWriter basicWriter; + + if(inputFile.exists()) { + inputReader = new BufferedReader(new FileReader("input.txt")); + } + else{ + basicWriter = new FileWriter("input.txt"); + try { + basicWriter.append("Мы добавляем первую базовую строку" + "\n"); + basicWriter.append("Мы добавляем вторую базовую строку" + "\n"); + basicWriter.append("Мы добавляем третью базовую строку, но чтуь чуть подлинее" + "\n"); + } + finally { + basicWriter.close(); + } + inputReader = new BufferedReader(new FileReader("input.txt")); + }; + + + /*** + * Получили файл на вход, теперь читаем его + */ + String line; + while( (line = inputReader.readLine()) != null){ + setLineCount(); + if(line.length() > getLongestLine().length()){ + setLongestLine(line); + } + char[] charArray = line.toCharArray(); + for(int i = 0; i < line.length(); i++){ + + if(charArray[i] == SPACE){ + setSpaceCount(); + } + } + } + + save(getLinesCount(),getSpaceCount(),getLongestLine()); + } + + + @Override + public int getSpaceCount() { + return this.spaceCount; + } + + @Override + public String getLongestLine() { + if(this.longestLine == null){ + return ""; + } + else + return this.longestLine; + } + + @Override + public int getLinesCount() { + return lineCount; + } + + @Override + public void save(int lineCount, int spaceCount, String line) throws IOException { + FileWriter outputFile = new FileWriter("output.txt"); + try { + outputFile.append("В данном файле строк " + lineCount + "\n"); + outputFile.append("В данном файле пробелов " + spaceCount + "\n"); + outputFile.append("Самая длинная строка в файле '" + line + "'" + "\n"); + } + finally { + outputFile.close(); + } + } + + @Override + public void setLineCount() { + this.lineCount++; + } + + @Override + public void setSpaceCount() { + this.spaceCount++; + } + + @Override + public void setLongestLine(String longestLine) { + this.longestLine = longestLine; + } +} \ No newline at end of file diff --git a/module02/src/test/java/ru/sberbank/edu/AppTest.java b/module02/src/test/java/ru/sberbank/edu/AppTest.java index 895d735c..b56d81e3 100644 --- a/module02/src/test/java/ru/sberbank/edu/AppTest.java +++ b/module02/src/test/java/ru/sberbank/edu/AppTest.java @@ -1,38 +1,24 @@ package ru.sberbank.edu; -import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +import java.io.IOException; /** * Unit test for simple App. */ -public class AppTest - extends TestCase -{ - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } +public class AppTest + extends TestCase{ - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); + @Test + void main() throws IOException { + StatisticImpl newStatistic = new StatisticImpl(); + newStatistic.start(); + Assertions.assertThat(newStatistic.getLongestLine()).isEqualTo("Мы добавляем третью базовую строку, но чтуь чуть подлинее"); + Assertions.assertThat(newStatistic.getSpaceCount()).isEqualTo(16); + Assertions.assertThat(newStatistic.getLinesCount()).isEqualTo(3); } -} +} \ No newline at end of file diff --git a/module03/pom.xml b/module03/pom.xml index 9363c7ed..91d1e68d 100644 --- a/module03/pom.xml +++ b/module03/pom.xml @@ -14,6 +14,41 @@ UTF-8 + + 11 + 11 + 5.9.2 + 5.5.0 + 5.3.1 + 3.24.2 + + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + test + + + org.mockito + mockito-core + ${mockito.version} + test + + + + org.mockito + mockito-junit-jupiter + ${mockito.junit.version} + test + + + org.assertj + assertj-core + ${assertj.version} + + + + diff --git a/module03/src/main/java/ru/sberbank/edu/CustomArrayImpl.java b/module03/src/main/java/ru/sberbank/edu/CustomArrayImpl.java new file mode 100644 index 00000000..5496cc30 --- /dev/null +++ b/module03/src/main/java/ru/sberbank/edu/CustomArrayImpl.java @@ -0,0 +1,143 @@ +package ru.sberbank.edu; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; + +public class CustomArrayImpl implements CustomArray{ + + private int size; + private Object[] objectsArray; + + CustomArrayImpl(){ + this(10); + } + CustomArrayImpl(int capacity){ + objectsArray = new Object[capacity]; + } + + @Override + public int size() { + return size; + } + + @Override + public boolean isEmpty() { + return size == 0; + } + + @Override + public boolean add(Object item) { + if (size == objectsArray.length){ + objectsArray = Arrays.copyOf(objectsArray, size * 2);; + } + objectsArray[size] = item; + ++size; + return true; + } + + @Override + public boolean addAll(Object[] items) { + for(int i = 0; i < items.length; i++){ + add(items[i]); + } + return true; + } + + @Override + public boolean addAll(Collection items) { + Iterator iterator = items.iterator(); + while (iterator.hasNext()){ + add(iterator.next()); + } + return true; + } + + @Override + public boolean addAll(int index, Object[] items) { + if (index < 0){ + throw new IndexOutOfBoundsException(); + } + + for(int i = index; i< items.length; i++){ + add(items[i]); + } + return true; + } + + @Override + public Object get(int index) { + return (T)objectsArray[index]; + } + + @Override + public Object set(int index, Object item) { + if (index < 0){ + throw new IndexOutOfBoundsException(); + } + return (T)(objectsArray[index] = item); + } + + @Override + public void remove(int index) { + if (index < 0 || index > size()){ + throw new IndexOutOfBoundsException(); + } + System.arraycopy(objectsArray,index + 1, objectsArray, index, size - index - 1); + } + + @Override + public boolean remove(Object item) { + for(int i = 0; i < size; i++){ + if(item.equals(objectsArray[i])){ + remove(i); + return true; + } + } + return false; + } + + @Override + public boolean contains(Object item) { + for(int i = 0; i < size; i++){ + if(item.equals(objectsArray[i])){ + return true; + } + } + return false; + } + + @Override + public int indexOf(Object item) { + for(int i = 0; i < size; i++){ + if(item.equals(objectsArray[i])){ + return i; + } + } + return -1; + } + + @Override + public void ensureCapacity(int newElementsCount) { + objectsArray = Arrays.copyOf(objectsArray, newElementsCount + size); + } + + @Override + public int getCapacity() { + return objectsArray.length; + } + + @Override + public void reverse() { + Object[] reverse = new Object[size]; + for (int i = 0; i < size(); i++){ + reverse[size - 1 - i ] = objectsArray[i]; + } + System.arraycopy(reverse,0,objectsArray,0,size()); + } + + @Override + public Object[] toArray() { + return objectsArray; + } +} diff --git a/module03/src/test/java/ru/sberbank/edu/CustomArrayImplTest.java b/module03/src/test/java/ru/sberbank/edu/CustomArrayImplTest.java new file mode 100644 index 00000000..2cd4c0ca --- /dev/null +++ b/module03/src/test/java/ru/sberbank/edu/CustomArrayImplTest.java @@ -0,0 +1,68 @@ +package ru.sberbank.edu; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.assertj.core.api.Assertions; + +class CustomArrayImplTest { + + private CustomArrayImpl customArray;//переменная хранения объекта для проверок + + @BeforeEach + public void setUp() { + customArray = new CustomArrayImpl<>(); + } + + @Test + public void testAddIncreasesSize() { + String item = "test"; + int initialSize = customArray.size(); + customArray.add(item); + int finalSize = customArray.size(); + Assertions.assertThat(initialSize + 1).isEqualTo(finalSize); + } + + @Test + public void testAddItem() { + String item = "test"; + customArray.add(item); + Object firstItem = customArray.get(0); + Assertions.assertThat(item).isEqualTo(firstItem); + } + + @Test + public void testIsEmpty() { + + Assertions.assertThat(customArray.isEmpty()).isTrue(); + } + + @Test + public void testIsNotEmpty() { + customArray.add(1); + Assertions.assertThat(customArray.isEmpty()).isFalse(); + } + + @Test + public void testAddAll() { + Integer[] elements = {3, 2, 1}; + customArray.addAll(elements); + for (Integer element : elements) { + Assertions.assertThat(customArray.contains(element)).isTrue(); + } + } + + @Test + public void testRemove() { + customArray.add("1"); + boolean result = customArray.remove("1"); + Assertions.assertThat(result).isTrue(); + Assertions.assertThat(customArray.isEmpty()).isTrue(); + } + + @Test + public void testContains() { + customArray.add(123); + Assertions.assertThat(customArray.contains(123)).isTrue(); + } + +} \ No newline at end of file diff --git a/module04/pom.xml b/module04/pom.xml index 7d3e7520..b3f40785 100644 --- a/module04/pom.xml +++ b/module04/pom.xml @@ -14,6 +14,39 @@ UTF-8 + 11 + 11 + 5.9.2 + 5.5.0 + 5.3.1 + 3.24.2 + + + org.junit.jupiter + junit-jupiter-engine + ${junit.version} + test + + + org.mockito + mockito-core + ${mockito.version} + test + + + + org.mockito + mockito-junit-jupiter + ${mockito.junit.version} + test + + + org.assertj + assertj-core + ${assertj.version} + + + diff --git a/module04/src/main/java/ru/sberbank/edu/App.java b/module04/src/main/java/ru/sberbank/edu/App.java index 5419c026..d69586c1 100644 --- a/module04/src/main/java/ru/sberbank/edu/App.java +++ b/module04/src/main/java/ru/sberbank/edu/App.java @@ -1,13 +1,36 @@ package ru.sberbank.edu; -/** - * Hello world! - * - */ +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + public class App { public static void main( String[] args ) { - System.out.println( "Hello World!" ); + + List intList = new ArrayList<>(); + + intList.add(1); + intList.add(2); + intList.add(2); + intList.add(1); + + Comparator comporator = new CustomDigitComparator(); + intList.sort(comporator); + + System.out.println(intList); + + + + List personList = new ArrayList<>(); + personList.add(new Person("Имя","Город",15)); + personList.add(new Person("иМя","Город123",15)); + personList.add(new Person("имЯ1","Город",15)); + personList.add(new Person("имя","Город",15)); + + personList.sort(Person::compareTo); + + System.out.println(personList); } } diff --git a/module04/src/main/java/ru/sberbank/edu/CustomDigitComparator.java b/module04/src/main/java/ru/sberbank/edu/CustomDigitComparator.java new file mode 100644 index 00000000..887946d0 --- /dev/null +++ b/module04/src/main/java/ru/sberbank/edu/CustomDigitComparator.java @@ -0,0 +1,26 @@ +package ru.sberbank.edu; + +import java.util.Comparator; + +public class CustomDigitComparator implements Comparator { + @Override + public int compare(Integer o1, Integer o2) { + + if (o1 == null || o2 == null){ + throw new RuntimeException(); + } + + int result1 = o1.intValue() % 2; + int result2 = o2.intValue() % 2; + + if (result1 == result2) { + return 0; + } else { + if (result1 != 0) { + return 1; + } else { + return -1; + } + } + } +} diff --git a/module04/src/main/java/ru/sberbank/edu/Person.java b/module04/src/main/java/ru/sberbank/edu/Person.java new file mode 100644 index 00000000..3fbf8bc9 --- /dev/null +++ b/module04/src/main/java/ru/sberbank/edu/Person.java @@ -0,0 +1,87 @@ +package ru.sberbank.edu; + +import java.util.Objects; + +public class Person implements Comparable { + private String name; + private String city; + + private int age; + + public Person(String name, String city, int age) { + this.name = name; + this.city = city; + this.age = age; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + @Override + public String toString() { + return "Person{" + + "name='" + name + '\'' + + ", city='" + city + '\'' + + ", age=" + age + + '}'; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Person person = (Person) o; + return age == person.age && name.equalsIgnoreCase(person.name) && city.equalsIgnoreCase(person.city); + } + + @Override + public int hashCode() { + String lclName = name.toLowerCase(); + String lclCity = city.toLowerCase(); + + return Objects.hash(lclName, lclCity, age); + } + + @Override + public int compareTo(Person o) { + if(this.city == null || o.city == null || this.name == null || o.name == null ){ + throw new RuntimeException(); + } + if (this.city.equalsIgnoreCase(o.city)){ + if(this.name.equalsIgnoreCase(o.name)){ + return 0; + }else if (this.name.compareToIgnoreCase(o.name) > 0){ + return 1; + }else{ + return -1; + } + } + if (this.city.compareTo(o.city) < 0) { + return -1; + } + else + return 1; + } +} + diff --git a/module04/src/test/java/ru/sberbank/edu/AppTest.java b/module04/src/test/java/ru/sberbank/edu/AppTest.java index 895d735c..5488bc80 100644 --- a/module04/src/test/java/ru/sberbank/edu/AppTest.java +++ b/module04/src/test/java/ru/sberbank/edu/AppTest.java @@ -1,5 +1,15 @@ package ru.sberbank.edu; +import junit.framework.TestCase; +import junit.framework.TestSuite; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; @@ -10,29 +20,31 @@ public class AppTest extends TestCase { - /** - * Create the test case - * - * @param testName name of the test case - */ - public AppTest( String testName ) - { - super( testName ); - } - /** - * @return the suite of tests being tested - */ - public static Test suite() - { - return new TestSuite( AppTest.class ); - } + @Test + void main(){ + + + List intList = new ArrayList<>(); + + intList.add(1); + intList.add(2); + intList.add(2); + intList.add(1); + + Comparator comporator = new CustomDigitComparator(); + intList.sort(comporator); + + List personList = new ArrayList<>(); + personList.add(new Person("Имя1","Город",15)); + personList.add(new Person("иМя","Город123",15)); + personList.add(new Person("имЯ","Город",15)); + personList.add(new Person("имя","Город",15)); + + personList.sort(Person::compareTo); + + Assertions.assertThat(intList.get(0) == 2 && intList.get(1) == 2 && intList.get(2) == 1 && intList.get(3) == 1 ).isTrue(); + Assertions.assertThat(personList.get(0).getCity().equals("Город") && personList.get(0).getName().equals("имЯ") && personList.get(3).getCity().equals("Город123") && personList.get(3).getName().equals("иМя") ).isTrue(); - /** - * Rigourous Test :-) - */ - public void testApp() - { - assertTrue( true ); } } diff --git a/module07/pom.xml b/module07/pom.xml index 3a76c8a1..6ae6e802 100644 --- a/module07/pom.xml +++ b/module07/pom.xml @@ -22,5 +22,21 @@ spring-web 3.0.2.RELEASE + + org.projectlombok + lombok + RELEASE + compile + + + com.fasterxml.jackson.core + jackson-annotations + 2.16.0 + + + com.fasterxml.jackson.core + jackson-databind + 2.16.0 + diff --git a/module07/src/main/java/ru/sberbank/edu/App.java b/module07/src/main/java/ru/sberbank/edu/App.java index 5419c026..24bf9180 100644 --- a/module07/src/main/java/ru/sberbank/edu/App.java +++ b/module07/src/main/java/ru/sberbank/edu/App.java @@ -1,5 +1,8 @@ package ru.sberbank.edu; +import ru.sberbank.edu.caches.WeatherCache; +import ru.sberbank.edu.provider.WeatherProvider; + /** * Hello world! * @@ -9,5 +12,11 @@ public class App public static void main( String[] args ) { System.out.println( "Hello World!" ); + + WeatherCache weatherCache = new WeatherCache(new WeatherProvider() ); + weatherCache.getWeatherInfo("London"); + System.out.println(weatherCache.getWeatherInfo("London")); + } + } diff --git a/module07/src/main/java/ru/sberbank/edu/WeatherInfo.java b/module07/src/main/java/ru/sberbank/edu/WeatherInfo.java deleted file mode 100644 index 9fcee430..00000000 --- a/module07/src/main/java/ru/sberbank/edu/WeatherInfo.java +++ /dev/null @@ -1,46 +0,0 @@ -package ru.sberbank.edu; - -import java.time.LocalDateTime; - -public class WeatherInfo { - - private String city; - - /** - * Short weather description - * Like 'sunny', 'clouds', 'raining', etc - */ - private String shortDescription; - - /** - * Weather description. - * Like 'broken clouds', 'heavy raining', etc - */ - private String description; - - /** - * Temperature. - */ - private double temperature; - - /** - * Temperature that fells like. - */ - private double feelsLikeTemperature; - - /** - * Wind speed. - */ - private double windSpeed; - - /** - * Pressure. - */ - private double pressure; - - /** - * Expiry time of weather info. - * If current time is above expiry time then current weather info is not actual! - */ - private LocalDateTime expiryTime; -} diff --git a/module07/src/main/java/ru/sberbank/edu/WeatherProvider.java b/module07/src/main/java/ru/sberbank/edu/WeatherProvider.java deleted file mode 100644 index 5fc6d989..00000000 --- a/module07/src/main/java/ru/sberbank/edu/WeatherProvider.java +++ /dev/null @@ -1,18 +0,0 @@ -package ru.sberbank.edu; - -public class WeatherProvider { - - // private RestTemplate restTemplate = null; - - /** - * Download ACTUAL weather info from internet. - * You should call GET http://api.openweathermap.org/data/2.5/weather?q={city name}&appid={API key} - * You should use Spring Rest Template for calling requests - * - * @param city - city - * @return weather info or null - */ - public WeatherInfo get(String city) { - return null; - } -} diff --git a/module07/src/main/java/ru/sberbank/edu/WeatherCache.java b/module07/src/main/java/ru/sberbank/edu/caches/WeatherCache.java similarity index 64% rename from module07/src/main/java/ru/sberbank/edu/WeatherCache.java rename to module07/src/main/java/ru/sberbank/edu/caches/WeatherCache.java index e0a2d02b..c3f61460 100644 --- a/module07/src/main/java/ru/sberbank/edu/WeatherCache.java +++ b/module07/src/main/java/ru/sberbank/edu/caches/WeatherCache.java @@ -1,4 +1,7 @@ -package ru.sberbank.edu; +package ru.sberbank.edu.caches; + +import ru.sberbank.edu.models.WeatherInfo; +import ru.sberbank.edu.provider.WeatherProvider; import java.util.HashMap; import java.util.Map; @@ -26,15 +29,21 @@ public WeatherCache(WeatherProvider weatherProvider) { * @param city - city * @return actual weather info */ - public WeatherInfo getWeatherInfo(String city) { + public synchronized WeatherInfo getWeatherInfo(String city) { // should be implemented - return null; + WeatherInfo cacheCity = cache.get(city); + if((cacheCity != null) && ( java.time.LocalDateTime.now().isAfter(cacheCity.getExpiryTime()))) { + return cache.get(city); + }else + removeWeatherInfo(city); + cache.put(city,weatherProvider.get(city)); + return weatherProvider.get(city); } /** * Remove weather info from cache. **/ public void removeWeatherInfo(String city) { - // should be implemented + cache.remove(city); } } diff --git a/module07/src/main/java/ru/sberbank/edu/models/WeatherInfo.java b/module07/src/main/java/ru/sberbank/edu/models/WeatherInfo.java new file mode 100644 index 00000000..7b7e9795 --- /dev/null +++ b/module07/src/main/java/ru/sberbank/edu/models/WeatherInfo.java @@ -0,0 +1,91 @@ +package ru.sberbank.edu.models; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.*; + +import java.time.LocalDateTime; +import java.util.Map; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +@ToString +@EqualsAndHashCode +public class WeatherInfo { + private static final Long TIME_TO_EXPIRE = 1L; + + @JsonProperty("name") + private String city; + + /** + * Short weather description + * Like 'sunny', 'clouds', 'raining', etc + */ + private String shortDescription; + /** + * Weather description. + * Like 'broken clouds', 'heavy raining', etc + */ + private String description; + + /** + * Temperature. + */ + private double temperature; + + /** + * Temperature that fells like. + */ + private double feelsLikeTemperature; + + /** + * Wind speed. + */ + private Double windSpeed; + + /** + * Pressure. + */ + private double pressure; + + /** + * Expiry time of weather info. + * If current time is above expiry time then current weather info is not actual! + */ + private LocalDateTime expiryTime = LocalDateTime.now().plusMinutes(TIME_TO_EXPIRE); + + /** + * Parse response and set values 'shortDescription' and 'description' into POJO + * @param weather + */ + @SuppressWarnings("unchecked") + @JsonProperty("weather") + private void unpackNestedWeather(Map[] weather) { + Map tempWeather = weather[0]; + this.shortDescription = (String)tempWeather.get("main"); + this.description = (String)tempWeather.get("description"); + } + + /** + * Parse response and set values 'temperature', 'pressure' and 'feelsLikeTemperature' into POJO + * @param main + */ + @SuppressWarnings("unchecked") + @JsonProperty("main") + private void unpackNestedMain(Map main) { + this.temperature = (double)main.get("temp"); + this.feelsLikeTemperature = (double) main.get("feels_like"); + this.pressure = (int) main.get("pressure"); + } + + /** + * Parse response and set value 'windSpeed' into POJO + * @param wind + */ + @SuppressWarnings("unchecked") + @JsonProperty("wind") + private void unpackNestedWind(Map wind) { + this.windSpeed = Double.parseDouble(wind.get("speed").toString()); + } +} diff --git a/module07/src/main/java/ru/sberbank/edu/provider/WeatherProvider.java b/module07/src/main/java/ru/sberbank/edu/provider/WeatherProvider.java new file mode 100644 index 00000000..4f47f0de --- /dev/null +++ b/module07/src/main/java/ru/sberbank/edu/provider/WeatherProvider.java @@ -0,0 +1,44 @@ +package ru.sberbank.edu.provider; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; +import ru.sberbank.edu.models.WeatherInfo; + +import java.time.LocalDateTime; + +public class WeatherProvider { + + private final RestTemplate restTemplate = new RestTemplate(); + private static final String API_KEY = "403cf62be23fdaba3e10e6cd77fc1631"; + + /** + * Download ACTUAL weather info from internet. + * You should call GET http://api.openweathermap.org/data/2.5/weather?q={city name}&appid={API key} + * You should use Spring Rest Template for calling requests + * + * @param city - city + * @return weather info or null + */ + public synchronized WeatherInfo get(String city) { + String url = "https://api.openweathermap.org/data/2.5/weather?q=" + city + "&appid=" + API_KEY + "&units=metric"; + try { + ResponseEntity response = restTemplate.getForEntity(url, String.class); + ObjectMapper mapper = new ObjectMapper(); + JsonNode root = mapper.readTree(response.getBody()); + WeatherInfo weatherInfo = new WeatherInfo(); + weatherInfo.setCity(String.valueOf(root.path("name")).replaceAll("\"", "")); + weatherInfo.setShortDescription(String.valueOf(root.path("weather").get(0).path("main")).replaceAll("\"", "")); + weatherInfo.setDescription(String.valueOf(root.path("weather").get(0).path("description")).replaceAll("\"", "")); + weatherInfo.setTemperature(Double.parseDouble(String.valueOf(root.path("main").path("temp")))); + weatherInfo.setFeelsLikeTemperature(Double.parseDouble(String.valueOf(root.path("main").path("feels_like")))); + weatherInfo.setWindSpeed(Double.parseDouble(String.valueOf(root.path("wind").path("speed")))); + weatherInfo.setPressure(Double.parseDouble(String.valueOf(root.path("main").path("pressure")))); + weatherInfo.setExpiryTime(LocalDateTime.now().plusMinutes(5)); + return weatherInfo; + } catch (Exception exception ) { + return null; + } + } +} diff --git a/module08/pom.xml b/module08/pom.xml index 5ab321fb..8bb6f70c 100644 --- a/module08/pom.xml +++ b/module08/pom.xml @@ -24,5 +24,10 @@ 3.8.1 test + + javax.servlet + javax.servlet-api + 3.1.0 + diff --git a/module08/src/main/car/author.html b/module08/src/main/car/author.html new file mode 100644 index 00000000..36a2c317 --- /dev/null +++ b/module08/src/main/car/author.html @@ -0,0 +1,15 @@ + + + + + Author + + + +

Автор работы

+

Рюрикх Николай Юрьевич

+

+
+Назад + + \ No newline at end of file diff --git a/module08/src/main/car/css/style.css b/module08/src/main/car/css/style.css new file mode 100644 index 00000000..9a0d0034 --- /dev/null +++ b/module08/src/main/car/css/style.css @@ -0,0 +1,35 @@ +body { + font-family: sans-serif; + font-size: 16px; +} + +p { + margin-left: 5%; +} + +div { + margin-left: 10%; +} + +img { + float: left; +} + +h1 { + margin-left: 5%; + font-size: 24px; + font-weight: bold; +} + +table { + margin-left: 5%; +} + +th, td { + border: 1px solid black; + padding: 10px; +} + +td { + text-align: left +} \ No newline at end of file diff --git a/module08/src/main/car/img/UAZ.png b/module08/src/main/car/img/UAZ.png new file mode 100644 index 00000000..6d1c6e96 Binary files /dev/null and b/module08/src/main/car/img/UAZ.png differ diff --git a/module08/src/main/car/index.html b/module08/src/main/car/index.html new file mode 100644 index 00000000..883be474 --- /dev/null +++ b/module08/src/main/car/index.html @@ -0,0 +1,49 @@ + + + + + Технические характеристики автомобиля UAZ + + + +

Автомобиль УАЗ Патриот

+ + + +

Технические характеристики

+
+ Длина

+ 4750 мм

+ + Ширина

+ 2110 мм

+ + Высота

+ 1910 мм

+ + Колесная база

+ 2760 мм

+ + Ширина передней колеи

+ 1600 мм

+ + Ширина задней колеи

+ 1600 мм

+ +
+

Варианты исполнения

+ + + + +
+
    +
  • ZMZ PRO 134,6 л/с
  • +
  • ZMZ PRO 149,6 л/с
  • +
+
+

+
+Автор работы + + \ No newline at end of file diff --git a/module08/src/main/java/ru/sberbank/edu/FinancialServlet.java b/module08/src/main/java/ru/sberbank/edu/FinancialServlet.java index f012968f..6fa526a6 100644 --- a/module08/src/main/java/ru/sberbank/edu/FinancialServlet.java +++ b/module08/src/main/java/ru/sberbank/edu/FinancialServlet.java @@ -1,13 +1,45 @@ package ru.sberbank.edu; -/** - * Hello world! - * - */ -public class FinancialServlet -{ - public static void main( String[] args ) - { - System.out.println( "Hello World!" ); +import javax.servlet.ServletException; +import javax.servlet.annotation.WebServlet; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@WebServlet(urlPatterns = "/finance") +public class FinancialServlet extends HttpServlet { + + double sumMin = 50000; + + @Override + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + getServletContext().getRequestDispatcher("/index.jsp").forward(request, response); + } + + @Override + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + double sum = 0; + double percentage = 0; + int years = 0; + + try{ + sum = Double.parseDouble(request.getParameter("sum")); + percentage = Double.parseDouble(request.getParameter("percentage")); + years = Integer.parseInt(request.getParameter("years")); + } catch (NullPointerException | NumberFormatException e) { + getServletContext().getRequestDispatcher("/error.jsp").forward(request, response); + } + + if (sum <= sumMin) { + getServletContext().getRequestDispatcher("/errorsum.jsp").forward(request, response); + } else { + + double interest = sum * percentage / 100 * years; + double total = sum + interest; + + request.setAttribute("calc", total); + getServletContext().getRequestDispatcher("/calculation.jsp").forward(request, response); + } } } diff --git a/module09/pom.xml b/module09/pom.xml index 59059ad5..bdc362f4 100644 --- a/module09/pom.xml +++ b/module09/pom.xml @@ -14,6 +14,26 @@ UTF-8 + 11 + 11 + + + org.springframework + spring-context + 5.3.25 + + + org.springframework + spring-web + 5.3.27 + compile + + + org.json + json + 20231013 + + diff --git a/module09/src/main/java/ru/sberbank/edu/App.java b/module09/src/main/java/ru/sberbank/edu/App.java index 5419c026..a8f0e4be 100644 --- a/module09/src/main/java/ru/sberbank/edu/App.java +++ b/module09/src/main/java/ru/sberbank/edu/App.java @@ -1,13 +1,20 @@ package ru.sberbank.edu; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import ru.sberbank.edu.config.AppConfig; + /** * Hello world! * */ -public class App -{ - public static void main( String[] args ) - { - System.out.println( "Hello World!" ); +public class App { + public static void main( String[] args ) { + ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); + WeatherCache cache = context.getBean(WeatherCache.class); + + WeatherInfo info = cache.getWeatherInfo("Moscow"); + + System.out.println(info); } } diff --git a/module09/src/main/java/ru/sberbank/edu/OpenWeatherProvider.java b/module09/src/main/java/ru/sberbank/edu/OpenWeatherProvider.java new file mode 100644 index 00000000..c989c4c0 --- /dev/null +++ b/module09/src/main/java/ru/sberbank/edu/OpenWeatherProvider.java @@ -0,0 +1,76 @@ +package ru.sberbank.edu; + +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.RestTemplate; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +/** + * Weather provider + */ +public class OpenWeatherProvider implements WeatherProvider { + + private RestTemplate restTemplate; + @Value("${weather.url}") + private String URL; + @Value("${app.key}") + private String appKey; + @Value("${expire.minute}") + private Integer expireMinute; + + @Autowired + public void setRestTemplate(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + + /** + * Download ACTUAL weather info from internet. + * You should call GET http://api.openweathermap.org/data/2.5/weather?q={city name}&appid={API key} + * You should use Spring Rest Template for calling requests + * + * @param city - city + * @return weather info or null + */ + public WeatherInfo get(String city) { + Map params = new HashMap<>(); + params.put("q", city); + params.put("appId", appKey); + + ResponseEntity response = restTemplate.getForEntity(URL, String.class, params); + JSONObject obj = new JSONObject(response.getBody()); + + return parse(obj); + } + + /** + * parse response to {@link WeatherInfo} + * @param obj {{@link JSONObject}} response + * @return {{@link WeatherInfo}} + */ + private WeatherInfo parse(JSONObject obj){ + String city = (String) obj.query("/name"); + String shortDescription = (String) obj.query("/weather/0/main"); + String description = (String) obj.query("/weather/0/description"); + BigDecimal temperature = (BigDecimal)obj.query("/main/temp"); + BigDecimal feelsLikeTemperature = (BigDecimal) obj.query("/main/feels_like"); + BigDecimal windSpeed = (BigDecimal) obj.query("/wind/speed"); + Integer pressure = (Integer) obj.query("/main/pressure"); + + return WeatherInfo.getBuilder() + .setCity(city) + .setShortDescription(shortDescription) + .setDescription(description) + .setTemperature(temperature.doubleValue()) + .setFeelsLikeTemperature(feelsLikeTemperature.doubleValue()) + .setWindSpeed(windSpeed.doubleValue()) + .setPressure(pressure.doubleValue()) + .setExpiryTime(LocalDateTime.now().plusMinutes(expireMinute)) + .build(); + } +} diff --git a/module09/src/main/java/ru/sberbank/edu/WeatherCache.java b/module09/src/main/java/ru/sberbank/edu/WeatherCache.java index 3f236f72..1bf3c3d1 100644 --- a/module09/src/main/java/ru/sberbank/edu/WeatherCache.java +++ b/module09/src/main/java/ru/sberbank/edu/WeatherCache.java @@ -1,40 +1,8 @@ package ru.sberbank.edu; -import java.util.HashMap; -import java.util.Map; +public interface WeatherCache { -/** - * Weather cache. - */ -public class WeatherCache { + WeatherInfo getWeatherInfo(String city); - private final Map cache = new HashMap<>(); - private WeatherProvider weatherProvider; - - /** - * Default constructor. - */ - public WeatherCache() { - } - - /** - * Get ACTUAL weather info for current city or null if current city not found. - * If cache doesn't contain weather info OR contains NOT ACTUAL info then we should download info - * If you download weather info then you should set expiry time now() plus 5 minutes. - * If you can't download weather info then remove weather info for current city from cache. - * - * @param city - city - * @return actual weather info - */ - public WeatherInfo getWeatherInfo(String city) { - // should be implemented - return null; - } - - /** - * Remove weather info from cache. - **/ - public void removeWeatherInfo(String city) { - // should be implemented - } -} \ No newline at end of file + void removeWeatherInfo(String city); +} diff --git a/module09/src/main/java/ru/sberbank/edu/WeatherCacheImpl.java b/module09/src/main/java/ru/sberbank/edu/WeatherCacheImpl.java new file mode 100644 index 00000000..b1185d9d --- /dev/null +++ b/module09/src/main/java/ru/sberbank/edu/WeatherCacheImpl.java @@ -0,0 +1,68 @@ +package ru.sberbank.edu; + +import org.springframework.beans.factory.annotation.Autowired; + +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.Map; + +/** + * Weather cache. + */ +public class WeatherCacheImpl implements WeatherCache{ + + private final Map cache = new HashMap<>(); + + private OpenWeatherProvider openWeatherProvider; + + @Autowired + public void setWeatherProvider(OpenWeatherProvider openWeatherProvider) { + this.openWeatherProvider = openWeatherProvider; + } + + /** + * Default constructor. + */ + public WeatherCacheImpl() { + } + + /** + * Get ACTUAL weather info for current city or null if current city not found. + * If cache doesn't contain weather info OR contains NOT ACTUAL info then we should download info + * If you download weather info then you should set expiry time now() plus 5 minutes. + * If you can't download weather info then remove weather info for current city from cache. + * + * @param city - city + * @return actual weather info + */ + public WeatherInfo getWeatherInfo(String city) { + boolean isExpired = false; + WeatherInfo info ; + + synchronized (cache){ + info = cache.get(city); + if (info != null) { + isExpired = info.expiryTime().isBefore(LocalDateTime.now()); + } + + if (info == null || isExpired){ + removeWeatherInfo(city); + try { + info = openWeatherProvider.get(city); + cache.put(city, info); + } catch (Exception ignored){} + } + } + + return info; + } + + /** + * Remove weather info from cache. + **/ + public void removeWeatherInfo(String city) { + synchronized (cache){ + cache.remove(city); + } + } +} \ No newline at end of file diff --git a/module09/src/main/java/ru/sberbank/edu/WeatherInfo.java b/module09/src/main/java/ru/sberbank/edu/WeatherInfo.java index 06d81ffc..c08583ab 100644 --- a/module09/src/main/java/ru/sberbank/edu/WeatherInfo.java +++ b/module09/src/main/java/ru/sberbank/edu/WeatherInfo.java @@ -6,7 +6,6 @@ * Weather info. */ public class WeatherInfo { - private String city; /** @@ -46,4 +45,100 @@ public class WeatherInfo { * If current time is above expiry time then current weather info is not actual! */ private LocalDateTime expiryTime; + + public String city() { + return city; + } + + public String shortDescription() { + return shortDescription; + } + + public String description() { + return description; + } + public double temperature() { + return temperature; + } + + public double feelsLikeTemperature() { + return feelsLikeTemperature; + } + + public double windSpeed() { + return windSpeed; + } + + public double pressure() { + return pressure; + } + + public LocalDateTime expiryTime() { + return expiryTime; + } + + @Override + public String toString() { + return "WeatherInfo{" + + "city='" + city + '\'' + + ", shortDescription='" + shortDescription + '\'' + + ", description='" + description + '\'' + + ", temperature=" + temperature + + ", feelsLikeTemperature=" + feelsLikeTemperature + + ", windSpeed=" + windSpeed + + ", pressure=" + pressure + + ", expiryTime=" + expiryTime + + '}'; + } + + public static WeatherInfoBuilder getBuilder(){ + return new WeatherInfo().new WeatherInfoBuilder(); + } + + public class WeatherInfoBuilder{ + private WeatherInfoBuilder(){} + + public WeatherInfo build(){ + return WeatherInfo.this; + } + + public WeatherInfoBuilder setCity(String city) { + WeatherInfo.this.city = city; + return this; + } + + public WeatherInfoBuilder setShortDescription(String shortDescription) { + WeatherInfo.this.shortDescription = shortDescription; + return this; + } + + public WeatherInfoBuilder setDescription(String description) { + WeatherInfo.this.description = description; + return this; + } + + public WeatherInfoBuilder setTemperature(double temperature) { + WeatherInfo.this.temperature = temperature; + return this; + } + + public WeatherInfoBuilder setFeelsLikeTemperature(double feelsLikeTemperature) { + WeatherInfo.this.feelsLikeTemperature = feelsLikeTemperature; + return this; + } + public WeatherInfoBuilder setPressure(double pressure) { + WeatherInfo.this.pressure = pressure; + return this; + } + + public WeatherInfoBuilder setExpiryTime(LocalDateTime expiryTime) { + WeatherInfo.this.expiryTime = expiryTime; + return this; + } + + public WeatherInfoBuilder setWindSpeed(double windSpeed) { + WeatherInfo.this.windSpeed = windSpeed; + return this; + } + } } diff --git a/module09/src/main/java/ru/sberbank/edu/WeatherProvider.java b/module09/src/main/java/ru/sberbank/edu/WeatherProvider.java index 02a2fb68..3771340e 100644 --- a/module09/src/main/java/ru/sberbank/edu/WeatherProvider.java +++ b/module09/src/main/java/ru/sberbank/edu/WeatherProvider.java @@ -1,22 +1,5 @@ package ru.sberbank.edu; -/** - * Weather provider - */ -public class WeatherProvider { - -// private RestTemplate restTemplate; -// private String appKey; - - /** - * Download ACTUAL weather info from internet. - * You should call GET http://api.openweathermap.org/data/2.5/weather?q={city name}&appid={API key} - * You should use Spring Rest Template for calling requests - * - * @param city - city - * @return weather info or null - */ - public WeatherInfo get(String city) { - return null; - } +public interface WeatherProvider { + WeatherInfo get(String city); } diff --git a/module09/src/main/java/ru/sberbank/edu/config/AppConfig.java b/module09/src/main/java/ru/sberbank/edu/config/AppConfig.java new file mode 100644 index 00000000..b43d4dd4 --- /dev/null +++ b/module09/src/main/java/ru/sberbank/edu/config/AppConfig.java @@ -0,0 +1,31 @@ +package ru.sberbank.edu.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.web.client.RestTemplate; +import ru.sberbank.edu.OpenWeatherProvider; +import ru.sberbank.edu.WeatherCache; +import ru.sberbank.edu.WeatherCacheImpl; +import ru.sberbank.edu.WeatherProvider; + +@Configuration +@PropertySource("classpath:app.properties") +public class AppConfig { + + @Bean + public RestTemplate getRestTemplate(){ + return new RestTemplate(); + } + + @Bean + public WeatherProvider getWeatherProvider(){ + return new OpenWeatherProvider(); + } + + @Bean + public WeatherCache getWeatherCache(){ + return new WeatherCacheImpl(); + } + +} diff --git a/module09/src/main/resources/app.properties b/module09/src/main/resources/app.properties new file mode 100644 index 00000000..7ef4cb18 --- /dev/null +++ b/module09/src/main/resources/app.properties @@ -0,0 +1,3 @@ +app.key=403cf62be23fdaba3e10e6cd77fc1631 +weather.url=http://api.openweathermap.org/data/2.5/weather?q={q}&APPID={appId} +expire.minute=5 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 2a2b5785..c8a24dac 100644 --- a/pom.xml +++ b/pom.xml @@ -24,8 +24,8 @@ UTF-8 - 17 - 17 + 11 + 11 5.9.2 5.5.0 5.3.1