├── .gitignore ├── README.md ├── Stage10 ├── pom.xml └── src │ └── main │ ├── java │ ├── JDBCExperiments │ │ ├── DBHelper.java │ │ ├── Main.java │ │ └── package-info.java │ └── SkillBoxDB │ │ ├── Entities │ │ ├── Course.java │ │ ├── LinkedPurchaseList.java │ │ ├── LinkedPurchaseListPK.java │ │ ├── PurchaseList.java │ │ ├── PurchaseListPK.java │ │ ├── Student.java │ │ └── Teacher.java │ │ ├── HibernateUtil.java │ │ ├── Main.java │ │ └── package-info.java │ └── resources │ ├── hibernate.cfg.xml │ └── skillbox_sql_dump.sql ├── Stage11 ├── pom.xml └── src │ ├── main │ ├── java │ │ ├── ImageResizer │ │ │ ├── Main.java │ │ │ ├── ThumbnailCreator.java │ │ │ └── package-info.java │ │ ├── SiteMap │ │ │ ├── Main.java │ │ │ ├── SitemapNode.java │ │ │ └── SitemapNodeRecursiveAction.java │ │ ├── ToDoList │ │ │ ├── DefaultController.java │ │ │ └── Main.java │ │ └── Transactions │ │ │ ├── Account.java │ │ │ ├── Bank.java │ │ │ ├── Demonstration.java │ │ │ ├── exceptions │ │ │ ├── AccountNotExistsException.java │ │ │ ├── BlockedAccountException.java │ │ │ ├── IdenticalAccountsException.java │ │ │ ├── ReplenishNotPossibleException.java │ │ │ └── WithdrawNotPossibleException.java │ │ │ └── package-info.java │ └── resources │ │ ├── log4j2.xml │ │ └── sitemap.txt │ └── test │ └── java │ └── Transactions │ ├── BankTest.java │ ├── ReplenishAccountTest.java │ └── WithdrawAccountTest.java ├── Stage12 ├── pom.xml └── src │ └── main │ ├── db_scripts │ └── create_admin_user.sql │ ├── java │ └── ToDoList │ │ ├── Main.java │ │ ├── config │ │ ├── InternalizationConfig.java │ │ ├── MvcConfig.java │ │ └── security │ │ │ ├── ApplicationSecurityConfig.java │ │ │ └── PasswordConfig.java │ │ ├── controllers │ │ ├── AdminController.java │ │ ├── RegistrationController.java │ │ ├── ToDoController.java │ │ └── UserController.java │ │ ├── models │ │ ├── Role.java │ │ ├── ToDo.java │ │ └── User.java │ │ ├── repositories │ │ ├── RoleRepository.java │ │ ├── ToDoRepository.java │ │ └── UserRepository.java │ │ └── service │ │ ├── Messages.java │ │ ├── ServiceUtils.java │ │ ├── TodoService.java │ │ ├── UserService.java │ │ └── exceptions │ │ ├── NoAnyUserException.java │ │ ├── ToDoNotFoundException.java │ │ └── UserNotFoundException.java │ └── resources │ ├── application.properties │ ├── messages_en.properties │ ├── messages_ru.properties │ └── templates │ ├── appusers.html │ ├── editmyprofile.html │ ├── edittodo.html │ ├── index.html │ ├── login.html │ └── registration.html ├── Stage13 ├── pom.xml └── src │ └── main │ ├── java │ ├── Homework_13_3 │ │ ├── Task1 │ │ │ ├── RedisStorage.java │ │ │ ├── RunTodoTask.java │ │ │ └── package-info.java │ │ └── Task2 │ │ │ ├── RedisStorage.java │ │ │ ├── RunStudentTask.java │ │ │ └── package-info.java │ ├── Homework_13_5 │ │ ├── Task1 │ │ │ ├── RedisStorage.java │ │ │ ├── RunFlightsTask.java │ │ │ └── package-info.java │ │ └── Task2 │ │ │ ├── RedisStorage.java │ │ │ ├── RunLoveSiteTask.java │ │ │ └── package-info.java │ ├── Homework_13_7 │ │ ├── Task1 │ │ │ ├── Book.java │ │ │ ├── FirstTaskRun.java │ │ │ └── package-info.java │ │ ├── Task2 │ │ │ ├── CsvReader.java │ │ │ ├── TaskRun.java │ │ │ ├── beans │ │ │ │ ├── Course.java │ │ │ │ └── Student.java │ │ │ ├── mongo.csv │ │ │ └── package-info.java │ │ └── TaskMongoClient.java │ └── Homework_13_8 │ │ ├── Task1 │ │ ├── Book.java │ │ ├── FirstTaskRun.java │ │ └── package-info.java │ │ ├── Task2 │ │ ├── CsvReader.java │ │ ├── TaskRun.java │ │ ├── beans │ │ │ ├── Course.java │ │ │ └── Student.java │ │ ├── mongo.csv │ │ └── package-info.java │ │ └── TaskMongoClient.java │ └── resources │ └── mongo.csv ├── Stage14 ├── pom.xml └── src │ └── main │ └── java │ └── Homework_14_7 │ ├── Concatenation.java │ ├── FileWriterThread.java │ ├── Loader.java │ └── package-info.java ├── Stage15 ├── pom.xml └── src │ └── main │ └── java │ └── Homework_15_4 │ ├── FileAccess.java │ └── Main.java ├── Stage16 ├── pom.xml └── src │ └── main │ └── java │ ├── Main.java │ ├── MainForm.form │ └── MainForm.java ├── Stage18 ├── pom.xml └── src │ ├── main │ └── java │ │ ├── array_max_value │ │ └── ArrayMaxValue.java │ │ ├── binary_search │ │ └── BinarySearch.java │ │ ├── bubble_sort │ │ └── BubbleSort.java │ │ ├── iteration_vs_recursion │ │ └── IterationVsRecursion.java │ │ ├── merge_sort │ │ └── MergeSort.java │ │ ├── quick_sort │ │ └── QuickSort.java │ │ └── rabin_karp │ │ └── RabinKarpExtended.java │ └── test │ └── java │ ├── BubbleSortTest.java │ ├── MergeSortTest.java │ ├── QuickSortTest.java │ └── RabinKarpTest.java ├── Stage19 ├── pom.xml └── src │ └── main │ └── java │ ├── Homework_19_5 │ ├── DoubleLinkedList │ │ ├── DoubleLinkedList.java │ │ └── DoubleListNode.java │ └── SingleLinkedList │ │ ├── SingleLinkedList.java │ │ └── SingleListNode.java │ ├── Homework_19_6 │ ├── BinaryTree.java │ └── Node.java │ └── Homework_19_7 │ ├── Node.java │ └── SuffixTree.java ├── Stage4 ├── pom.xml └── src │ └── main │ └── java │ ├── homework_41 │ ├── Container.java │ ├── Main.java │ └── package-info.java │ ├── homework_42 │ ├── Main.java │ └── package-info.java │ ├── homework_43 │ ├── RedCross.java │ └── package-info.java │ ├── homework_44 │ ├── Alphabet │ │ └── Alphabet.java │ ├── SimpleFioService │ │ └── Main.java │ ├── StringExperiments │ │ └── StringExperiments.java │ └── package-info.java │ ├── homework_45 │ ├── EnglishReader │ │ └── Main.java │ ├── RegexFioParser │ │ └── Main.java │ ├── StringExperiments │ │ └── Main.java │ ├── TelNum │ │ └── Main.java │ └── package-info.java │ └── homework_46 │ ├── BirthDay │ └── Main.java │ └── package-info.java ├── Stage5 ├── pom.xml └── src │ └── main │ └── java │ ├── homework_51 │ ├── ArrayX.java │ ├── HospitalAvgTemperature.java │ ├── ReverseArray.java │ └── package-info.java │ ├── homework_52 │ └── ToDoList.java │ ├── homework_53 │ └── EmailList.java │ ├── homework_54 │ └── PhoneBook.java │ └── homework_55 │ └── NumberGenerator.java ├── Stage6 ├── pom.xml └── src │ └── main │ └── java │ ├── homework_61 │ ├── DepositPaymentAccount.java │ ├── GamePaymentAccount.java │ ├── Main.java │ ├── PaymentAccount.java │ └── package-info.java │ ├── homework_613 │ ├── Company.java │ ├── Main.java │ ├── employees │ │ ├── Employee.java │ │ └── impl │ │ │ ├── Manager.java │ │ │ ├── Operator.java │ │ │ └── TopManager.java │ ├── options │ │ ├── BonusConfig.java │ │ └── PaymentRates.java │ └── package-info.java │ └── homework_66 │ ├── Client.java │ ├── Individual.java │ ├── IndividualEntrepreneur.java │ ├── LegalEntity.java │ ├── Main.java │ └── package-info.java ├── Stage8 ├── pom.xml └── src │ └── main │ └── java │ └── ConsoleCustomerList │ ├── Customer.java │ ├── CustomerStorage.java │ ├── Main.java │ └── exceptions │ ├── EmptyDataException.java │ ├── EmptyListException.java │ └── NotFindCustomerException.java ├── Stage9 ├── Data │ └── movementList.csv ├── pom.xml └── src │ └── main │ ├── java │ ├── BankStatement │ │ ├── Main.java │ │ ├── Utility.java │ │ ├── package-info.java │ │ └── pojo │ │ │ ├── BankAccount.java │ │ │ └── Operation.java │ ├── FolderCopy │ │ ├── Main.java │ │ └── primer │ │ │ └── src_dir │ │ │ ├── 1.xml │ │ │ ├── 2.xml │ │ │ └── tmp │ │ │ └── 3.xml │ ├── FolderSize │ │ ├── Main.java │ │ └── package-info.java │ ├── JsonParser │ │ ├── Main.java │ │ ├── package-info.java │ │ └── pojo │ │ │ ├── Line.java │ │ │ └── Passage.java │ └── LentaImageDownloader │ │ ├── Main.java │ │ └── package-info.java │ └── resources │ └── log4j2.xml └── pom.xml /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by .ignore support plugin (hsz.mobi) 2 | ###IDEA folders and files 3 | target/ 4 | *.logs 5 | *.iml 6 | .idea/ 7 | .eclipse 8 | 9 | ### Java template 10 | 11 | # Log file 12 | *.log 13 | 14 | # BlueJ files 15 | *.ctxt 16 | 17 | # Mobile Tools for Java (J2ME) 18 | .mtj.tmp/ 19 | 20 | # Package Files # 21 | *.jar 22 | *.war 23 | *.nar 24 | *.ear 25 | *.zip 26 | *.tar.gz 27 | *.rar 28 | 29 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 30 | hs_err_pid* 31 | 32 | 33 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # SkillBox_Java 2 | ## If this code from this repository helped you, please mark it with a star! 3 | -------------------------------------------------------------------------------- /Stage10/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | SkillBox_Java 7 | ru.bechol 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | Stage10 12 | 13 | 5.4.10.Final 14 | 15 | 16 | 17 | 18 | mysql 19 | mysql-connector-java 20 | 8.0.28 21 | 22 | 23 | 24 | org.hibernate 25 | hibernate-core 26 | 5.4.24.Final 27 | 28 | 29 | 30 | org.hibernate 31 | hibernate-entitymanager 32 | 5.4.10.Final 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /Stage10/src/main/java/JDBCExperiments/DBHelper.java: -------------------------------------------------------------------------------- 1 | package JDBCExperiments; 2 | 3 | import lombok.extern.log4j.Log4j2; 4 | 5 | import java.sql.Connection; 6 | import java.sql.DriverManager; 7 | import java.sql.SQLException; 8 | 9 | /** 10 | * Класс DBHElper. 11 | * Реализация подключения к базе данных. 12 | * @author Oleg Bech 13 | * @email oleg071984@gmail.com 14 | */ 15 | public class DBHelper { 16 | private static final String URL = "jdbc:mysql://localhost:3306/skillbox?" + 17 | "useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC"; 18 | private static final String USER = "root"; 19 | private static final String PASSWORD = "root"; 20 | 21 | /** 22 | * Метод Connection connect(). 23 | * Для установки подключения к базе данных. 24 | * 25 | * @return экземпляр Connection. 26 | */ 27 | public static Connection connect() { 28 | try { 29 | return DriverManager.getConnection(URL, USER, PASSWORD); 30 | } catch (SQLException sqle) { 31 | return null; 32 | } 33 | } 34 | 35 | 36 | } 37 | -------------------------------------------------------------------------------- /Stage10/src/main/java/JDBCExperiments/Main.java: -------------------------------------------------------------------------------- 1 | package JDBCExperiments; 2 | 3 | import java.sql.Connection; 4 | import java.sql.ResultSet; 5 | import java.sql.SQLException; 6 | import java.sql.Statement; 7 | 8 | /** 9 | * Домашнее задание 10.2.3. 10 | * @author Oleg Bech 11 | * @email oleg071984@gmail.com 12 | * @see package-info.java 13 | */ 14 | public class Main { 15 | /** 16 | * Создание соединения с базой данных. 17 | */ 18 | private static final Connection connection = DBHelper.connect(); 19 | /** 20 | * Строка SQL запроса к базе данных. 21 | */ 22 | private static final String sqlQuery = "SELECT course_name, " + 23 | "COUNT(MONTH(subscription_date)) / COUNT(DISTINCT MONTH(subscription_date)) AS count_per_month " + 24 | "FROM purchaselist GROUP BY course_name"; 25 | 26 | public static void main(String[] args) throws SQLException { 27 | try { 28 | if (connection != null) { 29 | Statement statement = connection.createStatement(); 30 | ResultSet resultSet = statement.executeQuery(sqlQuery); 31 | while (resultSet.next()) { 32 | System.out.println(resultSet.getString("course_name") + "\t" + 33 | resultSet.getString("count_per_month")); 34 | } 35 | } 36 | } catch (NullPointerException | SQLException ex) { 37 | ex.printStackTrace(); 38 | } finally { 39 | if (connection != null) 40 | connection.close(); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Stage10/src/main/java/JDBCExperiments/package-info.java: -------------------------------------------------------------------------------- 1 | package JDBCExperiments; 2 | /* 3 | Домашняя работа №10.2.3 4 | Написать код, который выведет для каждого курса среднее количество покупок в месяц. 5 | Лучше только средствами SQL (вариант “со звёздочкой”), но группировку по месяцам можно реализовать и с помощью Java. 6 | */ -------------------------------------------------------------------------------- /Stage10/src/main/java/SkillBoxDB/Entities/Course.java: -------------------------------------------------------------------------------- 1 | package SkillBoxDB.Entities; 2 | 3 | 4 | import lombok.*; 5 | 6 | import javax.persistence.*; 7 | import java.io.Serializable; 8 | import java.util.List; 9 | 10 | /** 11 | * Класс Course. 12 | * Описание сущности курса. 13 | * 14 | * @author Oleg Bech 15 | * @email oleg071984@gmail.com 16 | */ 17 | @Data 18 | @NoArgsConstructor 19 | @Entity 20 | @Table(name = "courses") 21 | public class Course implements Serializable { 22 | 23 | @Id 24 | @GeneratedValue(strategy = GenerationType.IDENTITY) 25 | private int id; 26 | private String name; 27 | private int duration; 28 | @Enumerated(EnumType.STRING) 29 | @Column(columnDefinition = "enum") 30 | private CourseType type; 31 | private String description; 32 | private Integer students_count; 33 | private int price; 34 | private float price_per_hour; 35 | 36 | @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 37 | @JoinColumn(name = "teacher_id") 38 | private Teacher teacher; 39 | 40 | @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 41 | @JoinTable(name = "subscriptions", 42 | joinColumns = {@JoinColumn(name = "course_id")}, 43 | inverseJoinColumns = {@JoinColumn(name = "student_id")} 44 | ) 45 | private List students; 46 | 47 | enum CourseType { 48 | DESIGN, PROGRAMMING, MARKETING, MANAGEMENT, BUSINESS 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /Stage10/src/main/java/SkillBoxDB/Entities/LinkedPurchaseList.java: -------------------------------------------------------------------------------- 1 | package SkillBoxDB.Entities; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | import lombok.NoArgsConstructor; 7 | 8 | import javax.persistence.*; 9 | import java.io.Serializable; 10 | import java.sql.Date; 11 | 12 | @Data 13 | @Entity 14 | @AllArgsConstructor 15 | @Table(name = "linkedpurchaselist") 16 | public class LinkedPurchaseList { 17 | 18 | @EmbeddedId 19 | private LinkedPurchaseListPK id; 20 | 21 | @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 22 | @JoinColumn(name = "student_id", referencedColumnName = "id", insertable = false, updatable = false) 23 | private Student student; 24 | 25 | @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 26 | @JoinColumn(name = "course_id", referencedColumnName = "id", insertable = false, updatable = false) 27 | private Course course; 28 | 29 | @Column(name = "student_name") 30 | private String studentName; 31 | 32 | @Column(name = "course_name") 33 | private String courseName; 34 | 35 | private int price; 36 | 37 | @Column(name = "subscription_date") 38 | private Date subscriptionDate; 39 | 40 | } 41 | -------------------------------------------------------------------------------- /Stage10/src/main/java/SkillBoxDB/Entities/LinkedPurchaseListPK.java: -------------------------------------------------------------------------------- 1 | package SkillBoxDB.Entities; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import javax.persistence.Column; 8 | import javax.persistence.Embeddable; 9 | import java.io.Serializable; 10 | 11 | @Data 12 | @AllArgsConstructor 13 | @EqualsAndHashCode 14 | @Embeddable 15 | public class LinkedPurchaseListPK implements Serializable { 16 | 17 | @Column(name = "student_id") 18 | int studentId; 19 | 20 | @Column(name = "course_id") 21 | int courseId; 22 | 23 | @SuppressWarnings("unused") 24 | LinkedPurchaseListPK() {} 25 | } 26 | -------------------------------------------------------------------------------- /Stage10/src/main/java/SkillBoxDB/Entities/PurchaseList.java: -------------------------------------------------------------------------------- 1 | package SkillBoxDB.Entities; 2 | 3 | import lombok.Data; 4 | 5 | import javax.persistence.*; 6 | import java.io.Serializable; 7 | import java.sql.Date; 8 | import java.util.Formatter; 9 | @Data 10 | @Entity 11 | @Table(name = "purchaselist") 12 | public class PurchaseList implements Serializable { 13 | 14 | @EmbeddedId 15 | private PurchaseListPK id; 16 | 17 | @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 18 | @JoinColumn(name = "student_name", referencedColumnName = "name", insertable = false, updatable = false) 19 | private Student student; 20 | 21 | @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 22 | @JoinColumn(name = "course_name", referencedColumnName = "name", insertable = false, updatable = false) 23 | private Course course; 24 | 25 | @Column(name = "price") 26 | private int price; 27 | 28 | @Column(name = "subscription_date") 29 | private Date subscriptionDate; 30 | 31 | @Override 32 | public String toString(){ 33 | return new Formatter().format("PurchaseList (studentName: %s, courseName: %s, subscriptionDate: %3$td.%3$tm.%3$tY)", 34 | id.studentName, id.courseName, subscriptionDate).toString(); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Stage10/src/main/java/SkillBoxDB/Entities/PurchaseListPK.java: -------------------------------------------------------------------------------- 1 | package SkillBoxDB.Entities; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.EqualsAndHashCode; 6 | 7 | import javax.persistence.Column; 8 | import javax.persistence.Embeddable; 9 | import java.io.Serializable; 10 | 11 | @Data 12 | @AllArgsConstructor 13 | @EqualsAndHashCode 14 | @Embeddable 15 | public class PurchaseListPK implements Serializable { 16 | 17 | @Column(name = "student_name") 18 | String studentName; 19 | 20 | @Column(name = "course_name") 21 | String courseName; 22 | 23 | @SuppressWarnings("unused") 24 | PurchaseListPK() {} 25 | } 26 | -------------------------------------------------------------------------------- /Stage10/src/main/java/SkillBoxDB/Entities/Student.java: -------------------------------------------------------------------------------- 1 | package SkillBoxDB.Entities; 2 | 3 | 4 | import lombok.*; 5 | 6 | import javax.persistence.*; 7 | import java.io.Serializable; 8 | import java.sql.Timestamp; 9 | import java.util.List; 10 | 11 | /** 12 | * Класс Student. 13 | * Описание сущности студента. 14 | * 15 | * @author Oleg Bech 16 | * @email oleg071984@gmail.com 17 | */ 18 | @Data 19 | @NoArgsConstructor 20 | @EqualsAndHashCode 21 | @Entity 22 | @Table(name = "students") 23 | public class Student implements Serializable { 24 | 25 | @Id 26 | @GeneratedValue(strategy = GenerationType.IDENTITY) 27 | private int id; 28 | private String name; 29 | private int age; 30 | @Basic 31 | private Timestamp registration_date; 32 | 33 | @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 34 | @JoinTable(name = "subscriptions", 35 | joinColumns = {@JoinColumn(name = "student_id")}, 36 | inverseJoinColumns = {@JoinColumn(name = "course_id")} 37 | ) 38 | private List courses; 39 | } 40 | -------------------------------------------------------------------------------- /Stage10/src/main/java/SkillBoxDB/Entities/Teacher.java: -------------------------------------------------------------------------------- 1 | package SkillBoxDB.Entities; 2 | 3 | 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import javax.persistence.*; 8 | import java.util.List; 9 | 10 | /** 11 | * Класс Teacher. 12 | * Описание сущности учителя. 13 | * 14 | * @author Oleg Bech 15 | * @email oleg071984@gmail.com 16 | */ 17 | @Data 18 | @NoArgsConstructor 19 | @Entity 20 | @Table(name = "teachers") 21 | public class Teacher { 22 | 23 | @OneToMany(fetch = FetchType.LAZY, mappedBy = "teacher") 24 | List courseList; 25 | @Id 26 | @GeneratedValue(strategy = GenerationType.IDENTITY) 27 | private int id; 28 | private String name; 29 | private int salary; 30 | private int age; 31 | } 32 | -------------------------------------------------------------------------------- /Stage10/src/main/java/SkillBoxDB/HibernateUtil.java: -------------------------------------------------------------------------------- 1 | package SkillBoxDB; 2 | 3 | import org.hibernate.SessionFactory; 4 | import org.hibernate.cfg.Configuration; 5 | 6 | /** 7 | * Класс HibernateUtil. 8 | * Создание SessionFactory для доступа к базе данных. 9 | * @author Oleg Bech 10 | * @email oleg071984@gmail.com 11 | */ 12 | public class HibernateUtil { 13 | 14 | private static final SessionFactory sessionFactory; 15 | 16 | static { 17 | try { 18 | Configuration config = new Configuration(); 19 | sessionFactory = config.configure().buildSessionFactory(); 20 | } catch (Throwable e) { 21 | System.out.println("Error in creating SessionFactory object." + e.getMessage()); 22 | throw new ExceptionInInitializerError(e); 23 | } 24 | } 25 | 26 | 27 | public static SessionFactory getSessionFactory() { 28 | return sessionFactory; 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Stage10/src/main/java/SkillBoxDB/Main.java: -------------------------------------------------------------------------------- 1 | package SkillBoxDB; 2 | 3 | import SkillBoxDB.Entities.*; 4 | import org.hibernate.Session; 5 | 6 | import java.util.List; 7 | 8 | /** 9 | * Домашняя работа 10.5.3. 10 | * 11 | * @author Oleg Bech 12 | * @email oleg071984@gmail.com 13 | * @see package-info.java 14 | */ 15 | 16 | public class Main { 17 | 18 | public static void main(String[] args) { 19 | 20 | Session session = HibernateUtil.getSessionFactory().openSession(); 21 | 22 | //Домашняя работа 10.3.2. 23 | Course course = session.get(Course.class, 1); 24 | System.out.println(course.getName() + " " + course.getType()); 25 | 26 | course.getStudents().forEach(s -> System.out.println(s.getName())); 27 | Student student = session.get(Student.class, 3); 28 | student.getCourses().forEach(c -> System.out.println(c.getName())); 29 | 30 | String allPurchasesHQL = "From " + PurchaseList.class.getSimpleName(); 31 | List purchaseLists = session.createQuery(allPurchasesHQL).getResultList(); 32 | 33 | purchaseLists.forEach(s -> { 34 | printPurchaseData(s); 35 | session.save(new LinkedPurchaseList( 36 | new LinkedPurchaseListPK(s.getStudent().getId(), s.getCourse().getId()), 37 | s.getStudent(), 38 | s.getCourse(), 39 | s.getStudent().getName(), 40 | s.getCourse().getName(), 41 | s.getPrice(), 42 | s.getSubscriptionDate() 43 | )); 44 | }); 45 | 46 | 47 | session.close(); 48 | } 49 | 50 | private static void printPurchaseData(PurchaseList purchase) { 51 | System.out.printf("student_id: %s%ncourse_id: %s%nstudent_name: %s%ncourse_name: %s%nprice: %s%n" + 52 | "subscription_date: %s%n-----------------------------------------%n", 53 | purchase.getStudent().getId(), 54 | purchase.getCourse().getId(), 55 | purchase.getStudent().getName(), 56 | purchase.getCourse().getName(), 57 | purchase.getPrice(), 58 | purchase.getSubscriptionDate() 59 | ); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Stage10/src/main/java/SkillBoxDB/package-info.java: -------------------------------------------------------------------------------- 1 | package SkillBoxDB; 2 | /* 3 | Домашняя работа 10.3.2. 4 | Подключите в вашем проекте Hibernate и напишите код, выводящий информацию о каком-нибудь курсе. 5 | Домашняя работа 10.5.3. 6 | Создать все таблицы и связи между ними для всей базы данных skillbox. 7 | */ -------------------------------------------------------------------------------- /Stage10/src/main/resources/hibernate.cfg.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | com.mysql.cj.jdbc.Driver 8 | 9 | jdbc:mysql://localhost:3306/skillbox?useSSL=false&useJDBCCompliantTimezoneShift=true&useUnicode=true&useLegacyDatetimeCode=false&serverTimezone=UTC 10 | 11 | root 12 | root 13 | 14 | 10 15 | 16 | org.hibernate.dialect.MySQL5Dialect 17 | 18 | true 19 | 20 | thread 21 | 22 | update 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | -------------------------------------------------------------------------------- /Stage11/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | SkillBox_Java 7 | ru.bechol 8 | 1.0-SNAPSHOT 9 | 10 | jar 11 | 4.0.0 12 | 13 | Stage11 14 | 15 | 16 | 17 | 18 | 19 | org.jsoup 20 | jsoup 21 | 1.15.3 22 | 23 | 24 | 25 | 26 | net.coobird 27 | thumbnailator 28 | 0.4.8 29 | 30 | 31 | 32 | 33 | junit 34 | junit 35 | 4.13.1 36 | test 37 | 38 | 39 | 40 | 41 | org.springframework.boot 42 | spring-boot-starter-web 43 | 2.5.12 44 | 45 | 46 | 47 | 48 | 49 | -------------------------------------------------------------------------------- /Stage11/src/main/java/ImageResizer/Main.java: -------------------------------------------------------------------------------- 1 | package ImageResizer; 2 | 3 | import java.io.File; 4 | import java.util.Arrays; 5 | import java.util.List; 6 | import java.util.Objects; 7 | import java.util.concurrent.atomic.AtomicInteger; 8 | import java.util.stream.Collectors; 9 | 10 | /** 11 | * Домашняя работа 11.4. 12 | * 13 | * @author Oleg Bech 14 | * @email oleg071984@gmail.com 15 | * @see package-info.java 16 | */ 17 | public class Main { 18 | /** 19 | * Путь к папке с изображениями. 20 | */ 21 | private final static String SOURCE_FOLDER_PATH = "d:/sourse_pic"; 22 | /** 23 | * Путь к папке с миниатюрами изображений. 24 | */ 25 | private final static String RESULT_FOLDER_PATH = "d:/result_pic"; 26 | /** 27 | * Количество ядер процессора. 28 | */ 29 | private final static int CORES_AMOUNT = Runtime.getRuntime().availableProcessors(); 30 | 31 | public static void main(String[] args) { 32 | try { 33 | final File sourceFolder = createFolder(SOURCE_FOLDER_PATH); 34 | final File destinationFolder = createFolder(RESULT_FOLDER_PATH); 35 | 36 | final AtomicInteger counter = new AtomicInteger(0); 37 | 38 | assert sourceFolder != null; 39 | List picList = Arrays.asList(Objects.requireNonNull(sourceFolder.listFiles())); 40 | 41 | picList.stream().collect(Collectors.groupingBy(it -> counter.getAndIncrement() / divider(picList))).values() 42 | .forEach(picsList -> new ThumbnailCreator(picsList, destinationFolder).run()); 43 | } catch (NullPointerException npe) { 44 | System.out.println("Некорректные параметры запуска."); 45 | } 46 | 47 | } 48 | 49 | /** 50 | * Метод int divider(List files). 51 | * Вычисляет делитель для разбиения заданной коллекции файлов на равные части. 52 | * 53 | * @param files коллекция файлов, которую необъходимо разделить. 54 | * @return делитель. 55 | */ 56 | private static int divider(List files) { 57 | return files != null && files.size() > 0 ? (files.size() - files.size() % CORES_AMOUNT) / CORES_AMOUNT : -1; 58 | } 59 | 60 | /** 61 | * Метод File createFolder(String path). 62 | * Проверяет существует ли по указанному path папка и является ли она папкой. 63 | * 64 | * @param path путь к папке с файлами. 65 | * @return экземпляр класса File. 66 | */ 67 | private static File createFolder(String path) { 68 | File result = new File(path); 69 | if (result.exists() && result.isDirectory()) { 70 | return result; 71 | } 72 | return null; 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /Stage11/src/main/java/ImageResizer/ThumbnailCreator.java: -------------------------------------------------------------------------------- 1 | package ImageResizer; 2 | 3 | import lombok.AllArgsConstructor; 4 | import net.coobird.thumbnailator.Thumbnails; 5 | 6 | import javax.imageio.ImageIO; 7 | import java.awt.image.BufferedImage; 8 | import java.io.File; 9 | import java.io.IOException; 10 | import java.util.List; 11 | import java.util.Objects; 12 | 13 | /** 14 | * Класс ThumbnailCreator. 15 | * Создает отдельный поток для уменьшения размеров картинок. 16 | * @autor Oleg Bech 17 | * @email oleg071984@gmail.com 18 | */ 19 | @AllArgsConstructor 20 | public class ThumbnailCreator implements Runnable { 21 | 22 | private List files; 23 | private File destinationFolder; 24 | 25 | @Override 26 | public void run() { 27 | try { 28 | for (File file : files) { 29 | System.out.println(file.getAbsolutePath()); 30 | BufferedImage image = ImageIO.read(file); 31 | if (image == null) { 32 | continue; 33 | } 34 | Thumbnails.of(image).size(100, 100) 35 | .toFile(destinationFolder.getAbsolutePath() + "/" + file.getName() + ".jpg"); 36 | } 37 | } catch (IOException | NullPointerException ioe) { 38 | ioe.printStackTrace(); 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Stage11/src/main/java/ImageResizer/package-info.java: -------------------------------------------------------------------------------- 1 | package ImageResizer; 2 | /* 3 | Домашняя работа 11.4. 4 | 11.4.1 На основе проекта ImageResizer написать программу уменьшения изображений таким образом, 5 | чтобы она запускала столько потоков, сколько ядер у процессора Вашего компьютера. 6 | 11.4.* Сделать так, чтобы уменьшение изображений было более аккуратным и плавным. 7 | */ -------------------------------------------------------------------------------- /Stage11/src/main/java/SiteMap/Main.java: -------------------------------------------------------------------------------- 1 | package SiteMap; 2 | 3 | import java.io.FileOutputStream; 4 | import java.io.IOException; 5 | import java.util.Collections; 6 | import java.util.concurrent.ForkJoinPool; 7 | 8 | /** 9 | * Класс Main. 10 | * Домашнее задание 11.21. 11 | * @author Oleg Bech 12 | * @email oleg071984@gmail.com 13 | */ 14 | public class Main { 15 | private static String ROOT_SITE = "https://lenta.ru/"; 16 | public static void main(String[] args) throws IOException { 17 | SitemapNode sitemapRoot = new SitemapNode(ROOT_SITE); 18 | new ForkJoinPool().invoke(new SitemapNodeRecursiveAction(sitemapRoot)); 19 | 20 | FileOutputStream stream = new FileOutputStream("Stage11/src/main/resources/sitemap.txt"); 21 | String result = createSitemapString(sitemapRoot, 0); 22 | stream.write(result.getBytes()); 23 | stream.flush(); 24 | stream.close(); 25 | } 26 | 27 | public static String createSitemapString(SitemapNode node, int depth) { 28 | String tabs = String.join("", Collections.nCopies(depth, "\t")); 29 | StringBuilder result = new StringBuilder(tabs + node.getUrl()); 30 | node.getChildren().forEach(child -> { 31 | result.append("\n").append(createSitemapString(child, depth + 1)); 32 | }); 33 | return result.toString(); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /Stage11/src/main/java/SiteMap/SitemapNode.java: -------------------------------------------------------------------------------- 1 | package SiteMap; 2 | 3 | import java.util.concurrent.CopyOnWriteArrayList; 4 | 5 | public class SitemapNode { 6 | private volatile SitemapNode parent; 7 | private volatile int depth; 8 | private String url; 9 | private volatile CopyOnWriteArrayList children; 10 | 11 | public SitemapNode(String url) { 12 | depth = 0; 13 | this.url = url; 14 | parent = null; 15 | children = new CopyOnWriteArrayList<>(); 16 | } 17 | 18 | private int calculateDepth() { 19 | int result = 0; 20 | if (parent == null) { 21 | return result; 22 | } 23 | result = 1 + parent.calculateDepth(); 24 | return result; 25 | } 26 | 27 | public synchronized void addChild(SitemapNode element) { 28 | SitemapNode root = getRootElement(); 29 | if(!root.contains(element.getUrl())) { 30 | element.setParent(this); 31 | children.add(element); 32 | } 33 | } 34 | 35 | private boolean contains(String url) { 36 | if (this.url.equals(url)) { 37 | return true; 38 | } 39 | for (SitemapNode child : children) { 40 | if(child.contains(url)) 41 | return true; 42 | } 43 | 44 | return false; 45 | } 46 | 47 | public String getUrl() { 48 | return url; 49 | } 50 | 51 | private void setParent(SitemapNode sitemapNode) { 52 | synchronized (this) { 53 | this.parent = sitemapNode; 54 | this.depth = calculateDepth(); 55 | } 56 | } 57 | 58 | public SitemapNode getRootElement() { 59 | return parent == null ? this : parent.getRootElement(); 60 | } 61 | 62 | public CopyOnWriteArrayList getChildren() { 63 | return children; 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /Stage11/src/main/java/SiteMap/SitemapNodeRecursiveAction.java: -------------------------------------------------------------------------------- 1 | package SiteMap; 2 | 3 | import org.jsoup.Connection; 4 | import org.jsoup.Jsoup; 5 | import org.jsoup.nodes.Document; 6 | import org.jsoup.nodes.Element; 7 | import org.jsoup.select.Elements; 8 | 9 | import java.io.IOException; 10 | import java.util.concurrent.RecursiveAction; 11 | import java.util.regex.Pattern; 12 | 13 | import static java.lang.Thread.sleep; 14 | 15 | public class SitemapNodeRecursiveAction extends RecursiveAction { 16 | private SitemapNode node; 17 | 18 | public SitemapNodeRecursiveAction(SitemapNode node) { 19 | this.node = node; 20 | } 21 | 22 | @Override 23 | protected void compute() { 24 | try { 25 | sleep(500); 26 | Connection connection = Jsoup.connect(node.getUrl()) 27 | .timeout(10000); 28 | Document page = connection.get(); 29 | Elements elements = page.select("body").select("a"); 30 | for (Element a : elements) { 31 | String childUrl = a.absUrl("href"); 32 | if (isCorrectUrl(childUrl)) { 33 | childUrl = stripParams(childUrl); 34 | System.out.println(childUrl); 35 | node.addChild(new SitemapNode(childUrl)); 36 | } 37 | } 38 | } catch (IOException | InterruptedException e) { 39 | System.out.println(e.toString());; 40 | } 41 | 42 | for (SitemapNode child : node.getChildren()) { 43 | SitemapNodeRecursiveAction task = new SitemapNodeRecursiveAction(child); 44 | task.compute(); 45 | } 46 | } 47 | 48 | private String stripParams(String url) { 49 | return url.replaceAll("\\?.+",""); 50 | } 51 | 52 | private boolean isCorrectUrl(String url) { 53 | Pattern patternRoot = Pattern.compile("^" + node.getUrl()); 54 | Pattern patternNotFile = Pattern.compile("([^\\s]+(\\.(?i)(jpg|png|gif|bmp|pdf))$)"); 55 | Pattern patternNotAnchor = Pattern.compile("#([\\w\\-]+)?$"); 56 | 57 | return patternRoot.matcher(url).lookingAt() 58 | && !patternNotFile.matcher(url).find() 59 | && !patternNotAnchor.matcher(url).find(); 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /Stage11/src/main/java/ToDoList/DefaultController.java: -------------------------------------------------------------------------------- 1 | package ToDoList; 2 | 3 | import org.springframework.web.bind.annotation.RequestMapping; 4 | import org.springframework.web.bind.annotation.RestController; 5 | 6 | import java.util.Date; 7 | import java.util.Random; 8 | 9 | /** 10 | * Класс DefaultController. 11 | * Контроллер для вывода текущей даты, времени и случайного числа на стартовой странице. 12 | */ 13 | @RestController 14 | public class DefaultController { 15 | @RequestMapping("/") 16 | public String index() { 17 | Random random = new Random(); 18 | return "Date: " + (new Date()).toString() + ". Random: " + random.nextLong(); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Stage11/src/main/java/ToDoList/Main.java: -------------------------------------------------------------------------------- 1 | package ToDoList; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | /** 7 | * Домашняя работа 12.4 8 | * @author Oleg Bech 9 | * @email oleg071984@gmail.com 10 | */ 11 | @SpringBootApplication 12 | public class Main { 13 | public static void main(String[] args) { 14 | SpringApplication.run(Main.class, args); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Stage11/src/main/java/Transactions/Account.java: -------------------------------------------------------------------------------- 1 | package Transactions; 2 | 3 | import Transactions.exceptions.ReplenishNotPossibleException; 4 | import Transactions.exceptions.WithdrawNotPossibleException; 5 | import lombok.AllArgsConstructor; 6 | import lombok.Data; 7 | import lombok.NonNull; 8 | import lombok.extern.log4j.Log4j2; 9 | import lombok.extern.slf4j.Slf4j; 10 | import org.apache.logging.log4j.LogManager; 11 | import org.apache.logging.log4j.Logger; 12 | 13 | import java.util.Objects; 14 | import java.util.concurrent.atomic.AtomicLong; 15 | 16 | /** 17 | * Класс Account. 18 | * Реализация счета в банке. 19 | * @author Oleg Bech 20 | * @email oleg071984@gmail.com 21 | */ 22 | @Data 23 | @AllArgsConstructor 24 | @Log4j2 25 | public class Account { 26 | 27 | /** 28 | * Номер счета. 29 | */ 30 | private String accountID; 31 | /** 32 | * Количество денег на счете. 33 | */ 34 | private AtomicLong balance; 35 | /** 36 | * Блокировка счета. 37 | */ 38 | private boolean blocked; 39 | 40 | public Account(@NonNull String accountID, long balance) { 41 | this.accountID = accountID; 42 | this.balance = new AtomicLong(balance); 43 | } 44 | 45 | /** 46 | * Метод replenish. 47 | * Пополнение счета на заданную сумму. 48 | * @param amount сумма пополнения. 49 | * @return true если счет пополнен. 50 | */ 51 | public boolean replenish(long amount) throws ReplenishNotPossibleException { 52 | if (isLegalOperation(amount)) { 53 | balance.addAndGet(amount); 54 | log.info("пополнение счета {} на сумму {}",accountID, amount); 55 | return true; 56 | } else { 57 | throw new ReplenishNotPossibleException(accountID); 58 | } 59 | } 60 | 61 | /** 62 | * Метод withdraw. 63 | * Списание со счета на заданную сумму. 64 | * @param amount сумма списания. 65 | */ 66 | public boolean withdraw(long amount) throws WithdrawNotPossibleException { 67 | if (isLegalOperation(amount) && balance.get() > amount) { 68 | balance.accumulateAndGet(amount, (x, y) -> x - y); 69 | log.info("списание со счета {} на сумму {}", accountID, amount); 70 | return true; 71 | } else { 72 | throw new WithdrawNotPossibleException(accountID); 73 | } 74 | } 75 | 76 | /** 77 | * Метод isLegalOperation. 78 | * Проверка основных параметров операции перед выполнением. 79 | * @param amount сумма операции. 80 | * @return true если сумма операции больше 0 и счет не блокирован. 81 | */ 82 | private boolean isLegalOperation(long amount) { 83 | return !blocked && amount > 0; 84 | } 85 | 86 | @Override 87 | public boolean equals(Object o) { 88 | if (this == o) return true; 89 | if (!(o instanceof Account)) return false; 90 | Account account = (Account) o; 91 | return getAccountID().equals(account.getAccountID()); 92 | } 93 | 94 | @Override 95 | public int hashCode() { 96 | return Objects.hash(getAccountID()); 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /Stage11/src/main/java/Transactions/Demonstration.java: -------------------------------------------------------------------------------- 1 | package Transactions; 2 | 3 | import java.util.ArrayList; 4 | import java.util.HashSet; 5 | import java.util.List; 6 | import java.util.Random; 7 | 8 | public class Demonstration { 9 | 10 | public static void main(String[] args) { 11 | 12 | HashSet accounts = new HashSet<>(); 13 | accounts.add(new Account("0", 120000)); 14 | accounts.add(new Account("1", 135000)); 15 | accounts.add(new Account("2", 156000)); 16 | accounts.add(new Account("3", 320000)); 17 | Bank bank = new Bank(accounts); 18 | 19 | Random random = new Random(); 20 | 21 | List threads = new ArrayList<>(); 22 | 23 | for (int i = 0; i < 50; i++) { 24 | threads.add(new Thread(() -> { 25 | bank.transfer(String.valueOf(random.nextInt(4)), 26 | String.valueOf(random.nextInt(4)), random.nextInt(70000)); 27 | })); 28 | } 29 | 30 | threads.forEach(Thread::start); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Stage11/src/main/java/Transactions/exceptions/AccountNotExistsException.java: -------------------------------------------------------------------------------- 1 | package Transactions.exceptions; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.extern.log4j.Log4j2; 5 | 6 | /** 7 | * Класс AccountNotExistsException. 8 | * Реализация исключения если счет не существует. 9 | * @author Oleg Bech 10 | * @email oleg071984@gmail.com 11 | */ 12 | @AllArgsConstructor 13 | @Log4j2 14 | public class AccountNotExistsException extends Exception { 15 | 16 | private String accountId; 17 | 18 | @Override 19 | public void printStackTrace() { 20 | log.error("Счет №{} не найден.", accountId); 21 | } 22 | 23 | @Override 24 | public String getMessage() { 25 | return "Счет №" + accountId + " не найден"; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Stage11/src/main/java/Transactions/exceptions/BlockedAccountException.java: -------------------------------------------------------------------------------- 1 | package Transactions.exceptions; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.extern.log4j.Log4j2; 5 | 6 | /** 7 | * Класс BlockedAccountException. 8 | * Реализация исключения если счет заблокирован. 9 | * 10 | * @author Oleg Bech 11 | * @email oleg071984@gmail.com 12 | */ 13 | @AllArgsConstructor 14 | @Log4j2 15 | public class BlockedAccountException extends Exception { 16 | 17 | private String accountId; 18 | 19 | @Override 20 | public void printStackTrace() { 21 | log.error("Счет №{} заблокирован. Перевод средств невозможен.", accountId); 22 | } 23 | 24 | @Override 25 | public String getMessage() { 26 | return "Cчет №" + accountId + " заблокирован. Перевод средств невозможен"; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Stage11/src/main/java/Transactions/exceptions/IdenticalAccountsException.java: -------------------------------------------------------------------------------- 1 | package Transactions.exceptions; 2 | 3 | import lombok.extern.log4j.Log4j2; 4 | 5 | /** 6 | * Класс IdenticalAccountsException. 7 | * Реализация исключения если для перевода указан один и тот же счет. 8 | * 9 | * @author Oleg Bech 10 | * @email oleg071984@gmail.com 11 | */ 12 | @Log4j2 13 | public class IdenticalAccountsException extends Exception { 14 | 15 | @Override 16 | public void printStackTrace() { 17 | log.error("Указаны одинаковые номера счетов. Перевод средств невозможен."); 18 | } 19 | 20 | @Override 21 | public String getMessage() { 22 | return "Указаны одинаковые номера счетов. Перевод средств невозможен."; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /Stage11/src/main/java/Transactions/exceptions/ReplenishNotPossibleException.java: -------------------------------------------------------------------------------- 1 | package Transactions.exceptions; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.extern.log4j.Log4j2; 5 | 6 | /** 7 | * Класс ReplenishNotPossibleException. 8 | * Реализация исключения если пополнение счет не возможно. 9 | * 10 | * @author Oleg Bech 11 | * @email oleg071984@gmail.com 12 | */ 13 | @AllArgsConstructor 14 | @Log4j2 15 | public class ReplenishNotPossibleException extends Exception { 16 | 17 | private String accountId; 18 | 19 | @Override 20 | public void printStackTrace() { 21 | log.error("Пополнение счета №{} невозможно.", accountId); 22 | } 23 | 24 | @Override 25 | public String getMessage() { 26 | return "Пополнение счета №" + accountId + " невозможно."; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Stage11/src/main/java/Transactions/exceptions/WithdrawNotPossibleException.java: -------------------------------------------------------------------------------- 1 | package Transactions.exceptions; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.extern.log4j.Log4j2; 5 | 6 | /** 7 | * Класс WithdrawNotPossibleException. 8 | * Реализация исключения если списание со счета не возможно. 9 | * 10 | * @author Oleg Bech 11 | * @email oleg071984@gmail.com 12 | */ 13 | @AllArgsConstructor 14 | @Log4j2 15 | public class WithdrawNotPossibleException extends Exception { 16 | 17 | private String accountId; 18 | 19 | @Override 20 | public void printStackTrace() { 21 | log.error("Списание по счету{} невозможно.", accountId); 22 | } 23 | 24 | @Override 25 | public String getMessage() { 26 | return "Списание по счету №" + accountId + " невозможно."; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Stage11/src/main/java/Transactions/package-info.java: -------------------------------------------------------------------------------- 1 | package Transactions; 2 | 3 | /* 4 | Домашняя работа 11.13. 5 | 6 | Проект Transactions. 7 | Есть банк, представленный классом Bank, в котором есть счета (класс Account) с двумя полями — money и accNumber. 8 | Все счета хранятся внутри банка. Клиенты банка (их много) могут делать переводы между счетами, запрашивать баланс 9 | по своему счету. Все это происходит в highly concurrent (многопоточной) среде. 10 | При этом, транзакции на крупные суммы (> 50000) отправляются на проверку Службе Безопасности. Можно считать, 11 | что таких транзакций не более 5% от всех. За эту проверку отвечает отдельный и уже реализованный кем-то метод Bank.isFraud. 12 | Служба безопасности в Банке всего одна, работает медленно и не может обрабатывать более одной транзакции одновременно. 13 | Проверка транзакции занимает у них 1000 мс. 14 | Если проверка выявила мошенничество, то необходимо заблокировать оба счета, т.е. запретить любые изменения остатков. 15 | 16 | Нужно реализовать: 17 | Метод “transfer” класса Bank, который переводит деньги с одного счета на другой. Если сумма транзакции > 50000, 18 | то после совершения транзакции, она отправляется на проверку Службе Безопасности – вызывается метод isFraud. 19 | Если возвращается true, то делается блокировка счетов (как – на ваше усмотрение). 20 | Метод getBalance класса Bank, который возвращает остаток на счете. 21 | Классы Account и Bank можно дорабатывать как угодно для решения задачи. 22 | Кроме того, необходимо реализовать адекватный тест (или набор тестов) для эмуляции реальной работы этих 23 | двух классов и проверки системы. 24 | */ -------------------------------------------------------------------------------- /Stage11/src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Stage11/src/main/resources/sitemap.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Bechol/SkillBox_Java/56cb4ff2e5243c69c93ec13d507c36b3fac03987/Stage11/src/main/resources/sitemap.txt -------------------------------------------------------------------------------- /Stage11/src/test/java/Transactions/ReplenishAccountTest.java: -------------------------------------------------------------------------------- 1 | package Transactions; 2 | 3 | import Transactions.exceptions.ReplenishNotPossibleException; 4 | import org.junit.Before; 5 | import org.junit.Test; 6 | 7 | import java.util.ArrayList; 8 | import java.util.concurrent.CompletableFuture; 9 | 10 | import static org.junit.Assert.assertEquals; 11 | 12 | /** 13 | * Класс ReplenishAccountTest. 14 | * JUnit тестирование операции пополнения счета. 15 | * 16 | * @author OLeg Bech. 17 | * @email oleg071984@gmail.com 18 | */ 19 | public class ReplenishAccountTest { 20 | 21 | Account acc = new Account("1", 1000); 22 | Account acc1 = new Account("2", 2000); 23 | Account acc2 = new Account("3", 3000); 24 | 25 | @Before 26 | public void blockAccount() { 27 | acc2.setBlocked(true); 28 | } 29 | 30 | /** 31 | * Тест пополнения счета когда сумма 0. 32 | */ 33 | @Test(expected = ReplenishNotPossibleException.class) 34 | public void whenAmount0ThenReplenishThrowsWithdrawNotPossibleException() throws ReplenishNotPossibleException { 35 | acc.replenish(0); 36 | } 37 | 38 | /** 39 | * Тест пополнения счета когда сумма меньше нуля. 40 | */ 41 | @Test(expected = ReplenishNotPossibleException.class) 42 | public void whenAmountNegativeThenReplenishThrowsWithdrawNotPossibleException() throws ReplenishNotPossibleException { 43 | acc.replenish(-500); 44 | } 45 | 46 | /** 47 | * Тест пополнения заблокированного счета. 48 | */ 49 | @Test(expected = ReplenishNotPossibleException.class) 50 | public void whenAccountBlockedThenReplenishThrowsWithdrawNotPossibleException() throws ReplenishNotPossibleException { 51 | acc2.replenish(500); 52 | } 53 | 54 | /** 55 | * Тест пополнения счета когда сумма больше нуля. 56 | */ 57 | @Test 58 | public void whenAmountMoreThan0ThenReplenishOk() throws ReplenishNotPossibleException { 59 | acc.replenish(600); 60 | assertEquals(1600, acc.getBalance().intValue()); 61 | } 62 | 63 | /** 64 | * Тест пополнения счета в многопоточной среде. 65 | */ 66 | @Test 67 | public void testReplenishBySomeThreads() { 68 | CompletableFuture.runAsync(() -> { 69 | ArrayList threads = new ArrayList<>(); 70 | for (int i = 0; i < 100; i++) { 71 | threads.add(new Thread(() -> { 72 | try { 73 | acc1.replenish(10); 74 | } catch (ReplenishNotPossibleException e) { 75 | e.printStackTrace(); 76 | } 77 | })); 78 | } 79 | threads.forEach(Thread::start); 80 | assertEquals(3000, acc1.getBalance().intValue()); 81 | }); 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /Stage11/src/test/java/Transactions/WithdrawAccountTest.java: -------------------------------------------------------------------------------- 1 | package Transactions; 2 | 3 | import Transactions.exceptions.WithdrawNotPossibleException; 4 | import org.junit.Before; 5 | import org.junit.Test; 6 | 7 | import java.util.ArrayList; 8 | import java.util.concurrent.CompletableFuture; 9 | 10 | import static org.junit.Assert.assertEquals; 11 | import static org.junit.Assert.assertFalse; 12 | /** 13 | * Класс WithdrawAccountTest. 14 | * JUnit тестирование операции списания со счета. 15 | * @author OLeg Bech. 16 | * @email oleg071984@gmail.com 17 | */ 18 | public class WithdrawAccountTest { 19 | 20 | Account acc = new Account("1",1000); 21 | Account acc1 = new Account("2",5000); 22 | Account acc2 = new Account("3", 10000); 23 | 24 | @Before 25 | public void blockAccount() { 26 | acc2.setBlocked(true); 27 | } 28 | 29 | /** 30 | * Тест списания со счета когда сумма 0. 31 | */ 32 | @Test(expected = WithdrawNotPossibleException.class) 33 | public void whenAmount0ThenThrowWithdrawOperationNotPossibleException() throws WithdrawNotPossibleException { 34 | acc.withdraw(0); 35 | } 36 | 37 | /** 38 | * Тест списания со счета когда сумма меньше нуля. 39 | */ 40 | @Test(expected = WithdrawNotPossibleException.class) 41 | public void whenAmountNegativeThenThrowWithdrawOperationNotPossibleException() throws WithdrawNotPossibleException { 42 | acc.withdraw(-500); 43 | } 44 | 45 | /** 46 | * Тест списания со счета когда сумма больше нуля и меньше баланса счета и счет не заблокирован. 47 | */ 48 | @Test 49 | public void whenAmountMoreThan0ThenWithdrawOk() throws WithdrawNotPossibleException { 50 | acc.withdraw(600); 51 | assertEquals(400, acc.getBalance().intValue()); 52 | } 53 | 54 | /** 55 | * Тест списания если сумма списания больше баланса счета. 56 | */ 57 | @Test(expected = WithdrawNotPossibleException.class) 58 | public void whenAmountBiggerThenThrowWithdrawOperationNotPossibleException() throws WithdrawNotPossibleException { 59 | acc.withdraw(2000); 60 | } 61 | 62 | /** 63 | * Тест списания если счет заблокирован. 64 | */ 65 | @Test(expected = WithdrawNotPossibleException.class) 66 | public void whenAccountBlockedThenThrowWithdrawOperationNotPossibleException() throws WithdrawNotPossibleException { 67 | acc2.withdraw(2000); 68 | } 69 | 70 | /** 71 | * Тест списания со счета в многопоточной среде. 72 | */ 73 | @Test 74 | public void testWithdrawBySomeThreads() { 75 | CompletableFuture.runAsync(() -> { 76 | ArrayList threads = new ArrayList<>(); 77 | for (int i = 0; i < 100; i++) { 78 | threads.add(new Thread(() -> { 79 | try { 80 | acc1.withdraw(10); 81 | } catch (WithdrawNotPossibleException e) { 82 | e.printStackTrace(); 83 | } 84 | })); 85 | } 86 | threads.forEach(Thread::start); 87 | assertEquals(4000, acc1.getBalance().intValue()); 88 | }); 89 | } 90 | } 91 | -------------------------------------------------------------------------------- /Stage12/src/main/db_scripts/create_admin_user.sql: -------------------------------------------------------------------------------- 1 | use todolist; 2 | insert into tbl_role values(1, 'ROLE_USER'); 3 | insert into tbl_role values(2, 'ROLE_ADMIN'); 4 | insert into tbl_user(id, email, first_name, last_name, username, password) values (1, 'oleg071984@gmail.com', 'Oleg', 'Bech', 'obech', '$2y$10$s421yB7r3t/QBu7LF5pZI.VW0.g.cHMpk2jVakWySF.k70A0ZQF4q'); 5 | insert into tbl_users_roles(user_id, role_id) values (1, 2); -------------------------------------------------------------------------------- /Stage12/src/main/java/ToDoList/Main.java: -------------------------------------------------------------------------------- 1 | package ToDoList; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | 6 | /** 7 | * Домашняя работа 12.4 8 | * Создайте проект ToDoList, который при входе через браузер по основному адресу будет отвечать текущей датой 9 | * или случайным числом. 10 | * 11 | * @author Oleg Bech 12 | * @email oleg071984@gmail.com 13 | */ 14 | @SpringBootApplication 15 | public class Main { 16 | public static void main(String[] args) { 17 | SpringApplication.run(Main.class, args); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Stage12/src/main/java/ToDoList/config/InternalizationConfig.java: -------------------------------------------------------------------------------- 1 | package ToDoList.config; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.context.support.ResourceBundleMessageSource; 6 | 7 | /** 8 | * Конфиг для локализации 9 | * 10 | * @author konovalovps97 created on 03.10.2019. 11 | */ 12 | @Configuration 13 | public class InternalizationConfig { 14 | 15 | @Bean 16 | public ResourceBundleMessageSource messageSource() { 17 | ResourceBundleMessageSource resourceBundleMessageSource = new ResourceBundleMessageSource(); 18 | resourceBundleMessageSource.setBasenames("messages"); 19 | return resourceBundleMessageSource; 20 | } 21 | } -------------------------------------------------------------------------------- /Stage12/src/main/java/ToDoList/config/MvcConfig.java: -------------------------------------------------------------------------------- 1 | package ToDoList.config; 2 | 3 | import org.springframework.context.annotation.Configuration; 4 | import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; 5 | import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 6 | 7 | @Configuration 8 | public class MvcConfig implements WebMvcConfigurer { 9 | 10 | @Override 11 | public void addViewControllers(ViewControllerRegistry registry) { 12 | registry.addViewController("/login").setViewName("login"); 13 | registry.addViewController("/edittodo").setViewName("edittodo"); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Stage12/src/main/java/ToDoList/config/security/ApplicationSecurityConfig.java: -------------------------------------------------------------------------------- 1 | package ToDoList.config.security; 2 | 3 | import ToDoList.service.UserService; 4 | import org.springframework.beans.factory.annotation.Autowired; 5 | import org.springframework.context.annotation.Bean; 6 | import org.springframework.context.annotation.Configuration; 7 | import org.springframework.security.authentication.dao.DaoAuthenticationProvider; 8 | import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 9 | import org.springframework.security.config.annotation.web.builders.HttpSecurity; 10 | import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 11 | import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 12 | import org.springframework.security.crypto.password.PasswordEncoder; 13 | import org.springframework.security.web.util.matcher.AntPathRequestMatcher; 14 | 15 | @Configuration 16 | @EnableWebSecurity 17 | public class ApplicationSecurityConfig extends WebSecurityConfigurerAdapter { 18 | 19 | private final PasswordEncoder passwordEncoder; 20 | private final UserService userService; 21 | 22 | @Autowired 23 | public ApplicationSecurityConfig(PasswordEncoder passwordEncoder, UserService userService) { 24 | this.passwordEncoder = passwordEncoder; 25 | this.userService = userService; 26 | } 27 | 28 | @Override 29 | protected void configure(HttpSecurity http) throws Exception { 30 | http 31 | .csrf().disable() 32 | .authorizeRequests() 33 | .antMatchers("/registration").permitAll() 34 | .antMatchers("/api/user/**").hasRole("USER") 35 | .antMatchers("/api/admin/**").hasRole("ADMIN") 36 | .antMatchers("/api/todo/**").hasAnyRole("ADMIN", "USER") 37 | .anyRequest() 38 | .authenticated() 39 | .and() 40 | .formLogin() 41 | .loginPage("/login").permitAll() 42 | .and() 43 | .logout() 44 | .logoutUrl("/logout") 45 | .logoutRequestMatcher(new AntPathRequestMatcher("/logout", "GET")) 46 | .clearAuthentication(true) 47 | .invalidateHttpSession(true) 48 | .deleteCookies("JSESSIONID") 49 | .logoutSuccessUrl("/"); 50 | } 51 | 52 | @Override 53 | protected void configure(AuthenticationManagerBuilder auth) { 54 | auth.authenticationProvider(daoAuthenticationProvider()); 55 | } 56 | 57 | @Bean 58 | public DaoAuthenticationProvider daoAuthenticationProvider() { 59 | DaoAuthenticationProvider provider = new DaoAuthenticationProvider(); 60 | provider.setPasswordEncoder(passwordEncoder); 61 | provider.setUserDetailsService(userService); 62 | return provider; 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /Stage12/src/main/java/ToDoList/config/security/PasswordConfig.java: -------------------------------------------------------------------------------- 1 | package ToDoList.config.security; 2 | 3 | import org.springframework.context.annotation.Bean; 4 | import org.springframework.context.annotation.Configuration; 5 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 6 | import org.springframework.security.crypto.password.PasswordEncoder; 7 | 8 | import javax.inject.Singleton; 9 | 10 | @Configuration 11 | public class PasswordConfig { 12 | 13 | @Bean 14 | public PasswordEncoder passwordEncoder() { 15 | return new BCryptPasswordEncoder(10); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Stage12/src/main/java/ToDoList/controllers/RegistrationController.java: -------------------------------------------------------------------------------- 1 | package ToDoList.controllers; 2 | 3 | import ToDoList.models.User; 4 | import ToDoList.service.UserService; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Controller; 8 | import org.springframework.ui.Model; 9 | import org.springframework.web.bind.annotation.GetMapping; 10 | import org.springframework.web.bind.annotation.ModelAttribute; 11 | import org.springframework.web.bind.annotation.PostMapping; 12 | import org.springframework.web.bind.annotation.RequestMapping; 13 | 14 | /** 15 | * Класс RegistrationController. 16 | * Контроллер. Регистрация новых пользователей со страницы "/login". 17 | * 18 | * @author Oleg Bech 19 | * @email oleg071984@gmail.com 20 | */ 21 | @Slf4j 22 | @Controller 23 | @RequestMapping("/registration") 24 | public class RegistrationController { 25 | 26 | private final UserService userService; 27 | 28 | @Autowired 29 | public RegistrationController(UserService userService) { 30 | this.userService = userService; 31 | } 32 | 33 | /** 34 | * Метод getRegistrationView. 35 | * Запрос на открытие страницы регистрации. 36 | * 37 | * @param model модель для добавления аттрибутов. 38 | * @return шаблон registration. 39 | * @request GET http://localhost:8080/registration. 40 | */ 41 | @GetMapping 42 | public String getRegistrationView(Model model) { 43 | model.addAttribute("newUser", new User()); 44 | return "registration"; 45 | } 46 | 47 | 48 | /** 49 | * Метод registrateNewUser. 50 | * POST запрос на добавление нового пользователя. 51 | * 52 | * @param newUser объект нового пользователя с параметрвми. 53 | * @return переход на главную страницу. 54 | * @request POST http://localhost:8080/registration. 55 | */ 56 | @PostMapping 57 | public String registrateNewUser(@ModelAttribute User newUser) { 58 | return userService.registrateUser(newUser) ? "redirect:/" : "redirect:/"; 59 | } 60 | 61 | } 62 | -------------------------------------------------------------------------------- /Stage12/src/main/java/ToDoList/controllers/UserController.java: -------------------------------------------------------------------------------- 1 | package ToDoList.controllers; 2 | 3 | import ToDoList.models.User; 4 | import ToDoList.service.UserService; 5 | import lombok.extern.slf4j.Slf4j; 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Controller; 8 | import org.springframework.ui.Model; 9 | import org.springframework.web.bind.annotation.GetMapping; 10 | import org.springframework.web.bind.annotation.PostMapping; 11 | 12 | import static ToDoList.service.ServiceUtils.getAuthenticatedUser; 13 | 14 | /** 15 | * Класс UserController. 16 | * Контроллер. Функционал для пользователя. 17 | * 18 | * @author Oleg Bech. 19 | * @email oleg071984@gmail.com. 20 | */ 21 | @Slf4j 22 | @Controller 23 | public class UserController { 24 | 25 | private final UserService userService; 26 | 27 | @Autowired 28 | public UserController(UserService userService) { 29 | this.userService = userService; 30 | } 31 | 32 | /** 33 | * Метод getAuthenticatedUserPropertiesView. 34 | * GET запрос для изменения свойств пользователя. 35 | * 36 | * @param model модель для добавления данных. 37 | * @return шаблон editmyprofile. 38 | * @request GET http://localhost:8080/user 39 | */ 40 | @GetMapping("/user") 41 | public String getAuthenticatedUserPropertiesView(Model model) { 42 | User user = userService.findUserById(getAuthenticatedUser().getId()); 43 | log.info("Authenticated user: {}", user); 44 | model.addAttribute("user", user); 45 | return "editmyprofile"; 46 | } 47 | 48 | /** 49 | * Метод updateAuthenticatedUserProfile. 50 | * Запрос для обновления свойств пользователя. 51 | * 52 | * @param user пользователь, параметры которого необходимо изменить. 53 | * @return переход на стратовую страницу. 54 | */ 55 | @PostMapping("/user/update") 56 | public String updateAuthenticatedUserProfile(User user) { 57 | User authenticatedUser = userService.findUserById(getAuthenticatedUser().getId()); 58 | userService.updateUserProperties(authenticatedUser, user); 59 | userService.changeUserPassword(authenticatedUser, user); 60 | return "redirect:/"; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /Stage12/src/main/java/ToDoList/models/Role.java: -------------------------------------------------------------------------------- 1 | package ToDoList.models; 2 | 3 | import com.fasterxml.jackson.annotation.JsonIgnore; 4 | import org.springframework.security.core.GrantedAuthority; 5 | 6 | import javax.persistence.*; 7 | import java.util.HashSet; 8 | import java.util.Set; 9 | 10 | @Entity 11 | @Table(name = "tbl_role") 12 | public class Role implements GrantedAuthority { 13 | 14 | @Id 15 | @GeneratedValue(strategy = GenerationType.IDENTITY) 16 | private Long id; 17 | private String name; 18 | 19 | /** 20 | * Связь с пользователями. 21 | */ 22 | 23 | @JsonIgnore 24 | @ManyToMany(mappedBy = "roles", cascade = CascadeType.ALL) 25 | private Set users = new HashSet<>(); 26 | 27 | public Role() { 28 | 29 | } 30 | 31 | public Role(String name) { 32 | this.name = name; 33 | } 34 | 35 | public Long getId() { 36 | return id; 37 | } 38 | 39 | public void setId(Long id) { 40 | this.id = id; 41 | } 42 | 43 | public String getName() { 44 | return name; 45 | } 46 | 47 | public void setName(String name) { 48 | this.name = name; 49 | } 50 | 51 | public Set getUsers() { 52 | return users; 53 | } 54 | 55 | public void setUsers(Set users) { 56 | this.users = users; 57 | } 58 | 59 | @JsonIgnore 60 | @Override 61 | public String getAuthority() { 62 | return getName(); 63 | } 64 | 65 | @Override 66 | public String toString() { 67 | return name; 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /Stage12/src/main/java/ToDoList/repositories/RoleRepository.java: -------------------------------------------------------------------------------- 1 | package ToDoList.repositories; 2 | 3 | import ToDoList.models.Role; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | @Repository 8 | public interface RoleRepository extends JpaRepository { 9 | 10 | Role findByName(String name); 11 | } 12 | -------------------------------------------------------------------------------- /Stage12/src/main/java/ToDoList/repositories/ToDoRepository.java: -------------------------------------------------------------------------------- 1 | package ToDoList.repositories; 2 | 3 | import ToDoList.models.ToDo; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.data.jpa.repository.JpaSpecificationExecutor; 6 | import org.springframework.stereotype.Repository; 7 | 8 | /** 9 | * Интерфейс ToDoRepository. 10 | * Репозиторий работы с таблицей todo. 11 | * 12 | * @author Oleg Bech 13 | * @email oleg071984@gmail.com 14 | */ 15 | @Repository 16 | public interface ToDoRepository extends JpaRepository, JpaSpecificationExecutor { 17 | } 18 | -------------------------------------------------------------------------------- /Stage12/src/main/java/ToDoList/repositories/UserRepository.java: -------------------------------------------------------------------------------- 1 | package ToDoList.repositories; 2 | 3 | import ToDoList.models.User; 4 | import org.springframework.data.jpa.repository.JpaRepository; 5 | import org.springframework.stereotype.Repository; 6 | 7 | import java.util.Optional; 8 | 9 | @Repository 10 | public interface UserRepository extends JpaRepository { 11 | 12 | Optional findUserByUsername(String username); 13 | } 14 | -------------------------------------------------------------------------------- /Stage12/src/main/java/ToDoList/service/Messages.java: -------------------------------------------------------------------------------- 1 | package ToDoList.service; 2 | 3 | import org.springframework.beans.factory.annotation.Autowired; 4 | import org.springframework.beans.factory.annotation.Value; 5 | import org.springframework.context.support.ResourceBundleMessageSource; 6 | import org.springframework.stereotype.Component; 7 | 8 | import java.util.Locale; 9 | 10 | /** 11 | * Класс для выдачи сообщений, в зависимости от локали 12 | * 13 | * @author konovalovps97 created on 03.10.2019. 14 | */ 15 | @Component 16 | public class Messages { 17 | 18 | /** 19 | * Класс для обращения к файлам локли по имени 20 | */ 21 | private ResourceBundleMessageSource messageSource; 22 | 23 | /** 24 | * Локаль приложения 25 | */ 26 | @Value("${spring.mvc.locale}") 27 | private String localeFromProperties; 28 | 29 | @Autowired 30 | public Messages(ResourceBundleMessageSource messageSource) { 31 | this.messageSource = messageSource; 32 | } 33 | 34 | /** 35 | * @param id id параметра в пропертях 36 | * @return сообщение, хранимое в пропертях 37 | */ 38 | public String getMessage(String id) { 39 | Locale locale = new Locale(localeFromProperties); 40 | return messageSource.getMessage(id, null, locale); 41 | } 42 | 43 | /** 44 | * @param id id параметра в пропертях 45 | * @param param Список параметров, которые участвуют в отображении 46 | * @return сообщение, хранимое в пропертях 47 | */ 48 | public String getMessage(String id, Object... param) { 49 | Locale locale = new Locale(localeFromProperties); 50 | return messageSource.getMessage(id, param, locale); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Stage12/src/main/java/ToDoList/service/ServiceUtils.java: -------------------------------------------------------------------------------- 1 | package ToDoList.service; 2 | 3 | import ToDoList.models.User; 4 | import org.springframework.security.core.context.SecurityContextHolder; 5 | 6 | /** 7 | * Класс ServiceUtils. 8 | * Утилитный класс для сервисного слоя. 9 | * 10 | * @author Oleg Bech. 11 | * @email oleg071984@gmail.com. 12 | */ 13 | public class ServiceUtils { 14 | /** 15 | * Метод getAuthenticatedUser. 16 | * Возврат авторизованного пользователя. 17 | * 18 | * @return объект класса User. 19 | */ 20 | public static User getAuthenticatedUser() { 21 | return (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal(); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Stage12/src/main/java/ToDoList/service/exceptions/NoAnyUserException.java: -------------------------------------------------------------------------------- 1 | package ToDoList.service.exceptions; 2 | 3 | public class NoAnyUserException extends NullPointerException { 4 | 5 | public NoAnyUserException(String message) { 6 | super(message); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Stage12/src/main/java/ToDoList/service/exceptions/ToDoNotFoundException.java: -------------------------------------------------------------------------------- 1 | package ToDoList.service.exceptions; 2 | 3 | import java.util.NoSuchElementException; 4 | 5 | public class ToDoNotFoundException extends NoSuchElementException { 6 | 7 | public ToDoNotFoundException(String message) { 8 | super(message); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Stage12/src/main/java/ToDoList/service/exceptions/UserNotFoundException.java: -------------------------------------------------------------------------------- 1 | package ToDoList.service.exceptions; 2 | 3 | import java.util.NoSuchElementException; 4 | 5 | public class UserNotFoundException extends NoSuchElementException { 6 | 7 | public UserNotFoundException(String message) { 8 | super(message); 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Stage12/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | spring.mvc.locale=en 2 | 3 | spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect 4 | spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 5 | spring.datasource.url = jdbc:mysql://localhost:3306/todolist?useSSL=false&useJDBCCompliantTimezoneShift=true&useUnicode=true&useLegacyDatetimeCode=false&serverTimezone=UTC&allowPublicKeyRetrieval=true 6 | spring.datasource.username=root 7 | spring.datasource.password=root 8 | spring.jpa.hibernate.ddl-auto=update 9 | spring.jpa.show-sql = true -------------------------------------------------------------------------------- /Stage12/src/main/resources/messages_en.properties: -------------------------------------------------------------------------------- 1 | todo.exception.todoIsNotExist=ToDo is not exist 2 | todo.exception.todoNotFindException="Todo not find" 3 | 4 | #User messages 5 | user.exception.userNotFound="User not found." 6 | user.delete.ok="User deleted by Id.; 7 | user.created="User created." 8 | user.created.byadmin="User created by admin." 9 | user.registration.failed.username="Username is empty. Registration failed." 10 | user.registration.failed.passwords="Passwords not match. Registration failed." 11 | user.registration.failed.userexists="User exists. Registration failed." 12 | user.update.userexist="User exist. Change username." 13 | user.update.updated="User updated." 14 | user.password.update.failed="User password update failed." 15 | users.empty="User list is empty." 16 | 17 | #Todo messages 18 | todo.create="Todo created." 19 | todo.notfound="Todo not found." 20 | todo.updated="Todo updated." 21 | todo.deleted="Todo deleted." 22 | 23 | #Role exception messages 24 | role.exception.roleNotFound="Role not found" 25 | 26 | #Todo exception messages 27 | todo.exception.todoNotFound="ToDo not found" -------------------------------------------------------------------------------- /Stage12/src/main/resources/messages_ru.properties: -------------------------------------------------------------------------------- 1 | todo.exception.todoIsNotExist=\u0417\u0430\u0434\u0430\u043d\u0438\u0435\u0020\u043d\u0435\u0020\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 2 | todo.exception.todoNotFindException=\u0414\u0435\u043B\u043E\u0020\u043D\u0435\u0020\u043D\u0430\u0439\u0434\u0435\u043D\u043E 3 | 4 | -------------------------------------------------------------------------------- /Stage12/src/main/resources/templates/edittodo.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Update todo 8 | 9 | 11 | 12 | 15 | 18 | 21 | 22 | 23 | 24 | Edit todo 25 | 26 | 28 | 29 | 30 | Name 31 | 32 | 33 | 34 | 35 | Start date 36 | 38 | 39 | 40 | End date 41 | 43 | 44 | 45 | 46 | Description 47 | 49 | 50 | 51 | Cancel 52 | Update 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /Stage12/src/main/resources/templates/login.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | TodoManager 8 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | Please log in 17 | 18 | Username 19 | 21 | 22 | 23 | Password 24 | 26 | 27 | 28 | Registration 29 | 30 | Log in 31 | 32 | 33 | 34 | -------------------------------------------------------------------------------- /Stage13/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | SkillBox_Java 7 | ru.bechol 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | Stage13 13 | 14 | 15 | 16 | org.redisson 17 | redisson 18 | 3.12.5 19 | 20 | 21 | org.projectlombok 22 | lombok 23 | 1.18.12 24 | 25 | 26 | org.slf4j 27 | slf4j-nop 28 | 1.7.30 29 | 30 | 31 | org.mongodb 32 | mongo-java-driver 33 | 3.8.2 34 | 35 | 36 | 37 | net.sf.opencsv 38 | opencsv 39 | 2.3 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_3/Task1/RedisStorage.java: -------------------------------------------------------------------------------- 1 | package Homework_13_3.Task1; 2 | 3 | import org.redisson.Redisson; 4 | import org.redisson.api.RSet; 5 | import org.redisson.api.RedissonClient; 6 | import org.redisson.client.RedisConnectionException; 7 | import org.redisson.config.Config; 8 | 9 | /** 10 | * Класс RedisStorage. 11 | * Работа с котейнером Redis. 12 | * Домашняя работа 13.3. 13 | * Задание 1. 14 | * Создаём контейнер Redis командой docker run --rm --name skill-redis -p 6379:6379 -d redis. 15 | * @author Oleg Bech 16 | * @email oleg071984@gmail.com 17 | * @see package-info.java 18 | */ 19 | public class RedisStorage { 20 | 21 | private RedissonClient redissonClient; 22 | private RSet todoSet; 23 | 24 | /** 25 | * Метод init(). 26 | * Подключение к docker-контейнеру Redis. 27 | */ 28 | public void init() { 29 | Config config = new Config(); 30 | config.useSingleServer().setAddress("redis://127.0.0.1:6379"); 31 | try { 32 | redissonClient = Redisson.create(config); 33 | } catch (RedisConnectionException Exc) { 34 | System.out.println("Failed to connect to Redis"); 35 | System.out.println(Exc.getMessage()); 36 | } 37 | todoSet = redissonClient.getSet("todoSet"); 38 | } 39 | 40 | /** 41 | * Метод addNewTodo. 42 | * Добавление нового дела. 43 | * @param todo новое дело. 44 | */ 45 | public void addNewTodo(String todo) { 46 | todoSet.add(todo); 47 | System.out.println("Added new todo: " + todo); 48 | } 49 | 50 | /** 51 | * Метод doTodo. 52 | * Выполнение нового дела путем удаления из контейнера Redis. 53 | * @param todo дело. 54 | */ 55 | public void doTodo(String todo) { 56 | todoSet.remove(todo); 57 | System.out.println(todo + " -> done 100%."); 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_3/Task1/RunTodoTask.java: -------------------------------------------------------------------------------- 1 | package Homework_13_3.Task1; 2 | 3 | import org.redisson.api.RSet; 4 | import org.redisson.api.RedissonClient; 5 | 6 | import java.util.HashSet; 7 | import java.util.Random; 8 | import java.util.Set; 9 | 10 | /** 11 | * Класс RunTodoTask. 12 | * Демонтрация выполнения задания 13.3.1. 13 | * @author Oleg Bech. 14 | * @email oleg071984@gmail.com 15 | * @see package-info.java 16 | */ 17 | public class RunTodoTask { 18 | //Коллекция запланированных дел 19 | private static RSet todoSet; 20 | //Клиент для контейнера Redis 21 | private RedissonClient redissonClient; 22 | 23 | public static void main(String[] args) { 24 | //подключаемся к нашему контейнеру Redis 25 | RedisStorage rs = new RedisStorage(); 26 | rs.init(); 27 | //коллекция запланированных дел 28 | Set todos = new HashSet<>(); 29 | todos.add("buy milk"); 30 | todos.add("fill the car"); 31 | todos.add("feed the cat"); 32 | //добавляем все запланированные дела в Redis 33 | System.out.println("Add new cases to the list:"); 34 | todos.forEach(todo -> { 35 | rs.addNewTodo(todo); 36 | try { 37 | Thread.sleep(500); 38 | } catch (InterruptedException e) { 39 | e.printStackTrace(); 40 | } 41 | }); 42 | //выполняем дела, удаляя поочередно из сета Redis 43 | System.out.println("Do things from the list:"); 44 | todos.forEach(todo -> { 45 | rs.doTodo(todo); 46 | try { 47 | Thread.sleep(new Random().nextInt(2000)); 48 | } catch (InterruptedException e) { 49 | e.printStackTrace(); 50 | } 51 | }); 52 | 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_3/Task1/package-info.java: -------------------------------------------------------------------------------- 1 | package Homework_13_3.Task1; 2 | 3 | /* 4 | Задание 1. 5 | 6 | — Ознакомьтесь с официальной документацией по командам, которые мы использовали в практике: SET, GET, KEYS, SADD, SREM, SMEMBERS. 7 | 8 | Список команд Redis 9 | — Воспользуйтесь инструкцией и установите redis-cli и Redis к себе на компьютер. 10 | 11 | — Используйте соответствующие команды, чтобы сохранить в Redis список дел: “купить молока”, “заправить машину”, “покормить кота”. Убедитесь что при повторном добавлении дела в список, список не меняется. 12 | 13 | — “Выполните” дела, удаляя их из базы один за одним. 14 | */ -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_3/Task2/RunStudentTask.java: -------------------------------------------------------------------------------- 1 | package Homework_13_3.Task2; 2 | 3 | /** 4 | * Класс RunStudentTask. 5 | * Домашнее задание 13.3.2 6 | * 7 | * @author Oleg Bech 8 | * @email oleg071984@gmail.com 9 | */ 10 | public class RunStudentTask { 11 | 12 | public static void main(String[] args) { 13 | RedisStorage rs = new RedisStorage(); 14 | //подключаемся к docker контейнеру Redis 15 | rs.init(); 16 | //добавляем данные 17 | rs.initData(); 18 | //выводим все данные о студентах в консоль 19 | rs.hgettall(); 20 | //увеличиваем количество пройденных заданий по заданному курсу. 21 | if (rs.increment("Bech O.I.", "Web dev", 21)) { 22 | System.out.println("OK"); 23 | rs.hgettall(); 24 | } else { 25 | System.out.println("System error."); 26 | } 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_3/Task2/package-info.java: -------------------------------------------------------------------------------- 1 | package Homework_13_3.Task2; 2 | 3 | /* 4 | 5 | Задание 2. 6 | Используйте Redis, чтобы сохранить информацию о том, сколько домашних заданий студент сдал по каждому курсу. 7 | Лучше всего для этого подойдет структура HashMap, вам пригодятся команды вроде HSET, HGET и др. 8 | 9 | Выполните следующе операции: 10 | 11 | Создайте запись для студента Иванов И.И., который проходит курсы “Web-Разработчик”, “Data Science”, 12 | и пока что выполнил одно ДЗ по Web-разработке и четыре задания по Data Science. 13 | 14 | Используйте команду для вывода всего содержимого нашего HashMap. 15 | 16 | Используйте команду для увеличения количества пройденных ДЗ по “Data Sicence” на 1. 17 | Используйте команду для того чтобы проверить что количество ДЗ конкретно по этому курсу действительно увеличилось. 18 | */ -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_5/Task1/RunFlightsTask.java: -------------------------------------------------------------------------------- 1 | package Homework_13_5.Task1; 2 | 3 | /** 4 | * Класс RunFlightsTask. 5 | * Демонтрация выполнения задания 13.5.1. 6 | * 7 | * @author Oleg Bech. 8 | * @email oleg071984@gmail.com 9 | * @see package-info.java 10 | */ 11 | public class RunFlightsTask { 12 | public static void main(String[] args) { 13 | RedisStorage rs = new RedisStorage(); 14 | rs.init(); 15 | rs.initData(); 16 | rs.readAll(); 17 | rs.showCheapestFlights(3); 18 | rs.showMostExpensive(3); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_5/Task1/package-info.java: -------------------------------------------------------------------------------- 1 | package Homework_13_5.Task1; 2 | /* 3 | Задание 1. 4 | 5 | Создайте Redis Sorted Set, и сохраните туда список из 10 городов, которые вы хотели бы посетить. 6 | В качестве приоритета используйте цену билета на самолет из вашего города, до города назначения. 7 | Выведите топ-3 самых дешевых и самых дорогих путешествий. 8 | */ -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_5/Task2/RedisStorage.java: -------------------------------------------------------------------------------- 1 | package Homework_13_5.Task2; 2 | 3 | import org.redisson.Redisson; 4 | import org.redisson.api.RDeque; 5 | import org.redisson.api.RedissonClient; 6 | import org.redisson.client.RedisConnectionException; 7 | import org.redisson.config.Config; 8 | 9 | import java.util.Deque; 10 | import java.util.LinkedList; 11 | 12 | /** 13 | * Класс RedisStorage. 14 | * Работа с котейнером Redis. 15 | * Домашняя работа 13.5. 16 | * Задание 2. 17 | * Создаём контейнер Redis командой docker run --rm --name skill-redis -p 6379:6379 -d redis. 18 | * 19 | * @author Oleg Bech 20 | * @email oleg071984@gmail.com 21 | * @see package-info.java 22 | */ 23 | public class RedisStorage { 24 | 25 | /** 26 | * Количество зарегистрированных пользователей. 27 | */ 28 | public static final int USERS_AMOUNT = 20; 29 | 30 | private RedissonClient redissonClient; 31 | private RDeque registeredUsersIds; 32 | 33 | 34 | /** 35 | * Метод init(). 36 | * Подключение к docker-контейнеру Redis. 37 | */ 38 | public void init() { 39 | Config config = new Config(); 40 | config.useSingleServer().setAddress("redis://127.0.0.1:6379"); 41 | try { 42 | redissonClient = Redisson.create(config); 43 | } catch (RedisConnectionException Exc) { 44 | System.out.println("Failed to connect to Redis"); 45 | System.out.println(Exc.getMessage()); 46 | } 47 | registeredUsersIds = redissonClient.getDeque("users"); 48 | } 49 | 50 | /** 51 | * Метод initData(); 52 | * Инициализация данных. 53 | */ 54 | public void initData() { 55 | for (int i = 0; i < USERS_AMOUNT; i++) { 56 | registeredUsersIds.add(i); 57 | } 58 | } 59 | 60 | /** 61 | * Метод addLast. 62 | * Добавление id пользователя в конец очереди показа. 63 | * @param userId - id пользователя. 64 | */ 65 | public void addLast(int userId) { 66 | registeredUsersIds.addLast(userId); 67 | } 68 | 69 | /** 70 | * Метод pushUser. 71 | * Доавление Id пользователя в самое начало очереди показа. 72 | * @param userId - Id пользователя. 73 | */ 74 | public void pushUser(int userId) { 75 | registeredUsersIds.push(userId); 76 | } 77 | 78 | /** 79 | * Метод peekFirstUser. 80 | * Возврат без удаления первого в очереди Id пользователя. 81 | * @return - Id пользователя. 82 | */ 83 | public Integer peekFirstUser() { 84 | return registeredUsersIds.peekFirst(); 85 | } 86 | 87 | /** 88 | * Метод removeFirstUser. 89 | * Удаление и возврат первого в очереди показа Id пользователя. 90 | * @return - Id пользовтеля. 91 | */ 92 | public Integer removeFirstUser() { 93 | return registeredUsersIds.removeFirst(); 94 | } 95 | 96 | 97 | } 98 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_5/Task2/RunLoveSiteTask.java: -------------------------------------------------------------------------------- 1 | package Homework_13_5.Task2; 2 | 3 | 4 | import java.util.Random; 5 | /** 6 | * Класс RunFlightsTask. 7 | * Демонтрация выполнения задания 13.5.2. 8 | * 9 | * @author Oleg Bech. 10 | * @email oleg071984@gmail.com 11 | * @see package-info.java 12 | */ 13 | public class RunLoveSiteTask { 14 | 15 | private static final Random RANDOM = new Random(); 16 | 17 | public static void main(String[] args) throws InterruptedException { 18 | 19 | RedisStorage rs = new RedisStorage(); 20 | rs.init(); 21 | rs.initData(); 22 | 23 | while (true) { 24 | for (int i = 1; i <= RedisStorage.USERS_AMOUNT; i++) { 25 | System.out.println("На главной странице показываем пользователя " + rs.peekFirstUser()); 26 | rs.addLast(rs.removeFirstUser()); 27 | if (i % getRandom() == 0) { 28 | System.out.println("Пользователь " + i + " оплатил платную услугу"); 29 | rs.pushUser(i); 30 | } 31 | } 32 | System.out.println("==="); 33 | Thread.sleep(2000); 34 | } 35 | } 36 | 37 | /** 38 | * Метод getRnd. 39 | * Возврат случайного числа для определния оплатившего подъем пользователя. 40 | * @return случайное число. 41 | */ 42 | private static int getRandom() { 43 | return RANDOM.nextInt(RedisStorage.USERS_AMOUNT)+1; 44 | } 45 | 46 | 47 | } 48 | 49 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_5/Task2/package-info.java: -------------------------------------------------------------------------------- 1 | package Homework_13_5.Task2; 2 | 3 | /* 4 | У вас есть сайт знакомств, на котором уже зарегистрировалось 20 пользователей. 5 | Показывайте их всех по очереди на главной странице сайта: изначально все пользователи упорядочены в порядке регистрации. 6 | После каждого показа пользователь отправляется в конец очереди. 7 | Иногда пользователи оплачивают специальную услугу, которая перемещает их в начало очереди. 8 | 9 | Напишите программу, которая будет эмулировать работу такого сайта, хранить очередь в Redis, и выводить лог операций в консоль. 10 | 11 | Программа должна запускать бесконечный цикл, в котором: 12 | 13 | 1. Выводится в консоль номер пользователя, которого нужно сейчас отобразить на главной странице. 14 | 15 | 2. В одном из 10 случаев, случайный пользователь оплачивает платную услугу, в консоль выводится его номер. 16 | 17 | 3. Программа ждет 1 секунду, и цикл начинается заново. 18 | 19 | Пример вывода: 20 | 21 | — На главной странице показываем пользователя 1 22 | — На главной странице показываем пользователя 2 23 | — На главной странице показываем пользователя 3 24 | > Пользователь 8 оплатил платную услугу 25 | — На главной странице показываем пользователя 8 26 | — На главной странице показываем пользователя 4 27 | … [пропущено] Показываем 5,6,7,9,10,11,12,13,14,15,16,17,18,19… 28 | — На главной странице показываем пользователя 1 [снова] 29 | И т.д. 30 | */ -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_7/Task1/Book.java: -------------------------------------------------------------------------------- 1 | package Homework_13_7.Task1; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | @Data 7 | @AllArgsConstructor 8 | public class Book { 9 | 10 | private String name; 11 | private String author; 12 | private int year; 13 | } 14 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_7/Task1/FirstTaskRun.java: -------------------------------------------------------------------------------- 1 | package Homework_13_7.Task1; 2 | 3 | 4 | import Homework_13_7.TaskMongoClient; 5 | import com.mongodb.client.MongoCollection; 6 | import com.mongodb.client.MongoDatabase; 7 | import com.mongodb.client.model.Filters; 8 | import org.bson.BsonDocument; 9 | import org.bson.Document; 10 | 11 | import java.util.function.Consumer; 12 | import java.util.stream.Stream; 13 | 14 | public class FirstTaskRun { 15 | 16 | public static void main(String[] args) { 17 | 18 | MongoDatabase database = new TaskMongoClient().getMongoDatabase(); 19 | MongoCollection booksCollection = database.getCollection("books"); 20 | booksCollection.drop(); 21 | 22 | Stream bookStream = Stream.of( 23 | new Book("Философия Java", "Эккель Брюс", 2019), 24 | new Book("Искусство программирования на Java", "Герберт Шилдт", 2005), 25 | new Book("Java. Полное руководство", "Герберт Шилдт", 2018), 26 | new Book("Effective Java", "Блох Джошуа", 2008), 27 | new Book("Spring 4 Для профессионалов", "Крис Шеффер", 2015), 28 | new Book("Java Persistence with Hibernate. Second edition", "Кристиан Бауер", 2016) 29 | ); 30 | 31 | bookStream.forEach(book -> { 32 | booksCollection.insertOne( 33 | new Document() 34 | .append("name", book.getName()) 35 | .append("author", book.getAuthor()) 36 | .append("year", book.getYear()) 37 | ); 38 | }); 39 | 40 | //запрос на самую старую книгу 41 | System.out.println("Самая старая книга:"); 42 | BsonDocument oneOlderBookSortQuery = BsonDocument.parse("{year: 1}"); 43 | System.out.println(booksCollection.find().sort(oneOlderBookSortQuery).first()); 44 | //запрос на книги любимого автора 45 | System.out.println("Книги любимого автора:"); 46 | booksCollection.find(Filters.eq("author", "Герберт Шилдт")) 47 | .forEach((Consumer) System.out::println); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_7/Task1/package-info.java: -------------------------------------------------------------------------------- 1 | package Homework_13_7.Task1; 2 | /* 3 | Установите mongodb и mongo-shell. 4 | 5 | Создайте коллекцию “books”, и добавьте в нее информацию о 5 ваших любимых книгах: 6 | 7 | Название, имя автора, и год создания. Добавьте как минимум две разных книги вашего любимого автора. 8 | 9 | — Напишите запрос для выбора одной самой старой книги из коллекции. 10 | 11 | — Напишите запрос, который выводит только книги вашего любимого автора. 12 | */ -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_7/Task2/CsvReader.java: -------------------------------------------------------------------------------- 1 | package Homework_13_7.Task2; 2 | 3 | import Homework_13_7.Task2.beans.Course; 4 | import Homework_13_7.Task2.beans.Student; 5 | import au.com.bytecode.opencsv.CSVReader; 6 | import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; 7 | import au.com.bytecode.opencsv.bean.CsvToBean; 8 | import lombok.AllArgsConstructor; 9 | 10 | import java.io.BufferedReader; 11 | import java.io.File; 12 | import java.io.FileNotFoundException; 13 | import java.io.FileReader; 14 | import java.util.Arrays; 15 | import java.util.List; 16 | import java.util.stream.Collectors; 17 | 18 | /** 19 | * Класс CsvReader. 20 | * Чтение csv файла. 21 | * @author Oleg Bech. 22 | * @email oleg071984@gmail.com 23 | */ 24 | @AllArgsConstructor 25 | public class CsvReader { 26 | 27 | private final File sourceCsvFile; 28 | private final CsvToBean csv = new CsvToBean(); 29 | 30 | /** 31 | * Метод ColumnPositionMappingStrategy. 32 | * Маппинг колонок csv файла. 33 | * @return ColumnPositionMappingStrategy. 34 | */ 35 | private static ColumnPositionMappingStrategy setColumMapping() { 36 | ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy(); 37 | strategy.setType(Student.class); 38 | String[] columns = new String[]{"name", "age", "courses"}; 39 | strategy.setColumnMapping(columns); 40 | return strategy; 41 | } 42 | 43 | /** 44 | * Метод createStudentList. 45 | * Создание коллекции студентов из заданного csv файла. 46 | * @return коллекция студентов. 47 | * @throws FileNotFoundException 48 | */ 49 | public List createStudentList() throws FileNotFoundException { 50 | 51 | CSVReader csvFileReader = new CSVReader(new BufferedReader(new FileReader(sourceCsvFile))); 52 | List stList = csv.parse(setColumMapping(), csvFileReader); 53 | stList.forEach(student -> student.setCourseList( 54 | Arrays.stream(student.getCourses().split(",")).map(Course::new).collect(Collectors.toList())) 55 | ); 56 | return stList; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_7/Task2/TaskRun.java: -------------------------------------------------------------------------------- 1 | package Homework_13_7.Task2; 2 | 3 | import Homework_13_7.Task2.beans.Student; 4 | import Homework_13_7.TaskMongoClient; 5 | import com.mongodb.client.MongoCollection; 6 | import com.mongodb.client.MongoDatabase; 7 | import com.mongodb.client.model.Filters; 8 | import org.bson.BsonDocument; 9 | import org.bson.Document; 10 | 11 | import java.io.File; 12 | import java.io.FileNotFoundException; 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | import java.util.stream.Collectors; 16 | 17 | /** 18 | * Класс TaskRun. 19 | * Демострация выполнения домашнего задания 13.7.1 20 | * @author Oleg Bech 21 | * @email oleg071984@gmail.com 22 | */ 23 | public class TaskRun { 24 | 25 | private static final File CSV_FILE = new File("Stage13/src/main/java/Homework_13_7/Task2/mongo.csv"); 26 | 27 | public static void main(String[] args) throws FileNotFoundException { 28 | 29 | CsvReader csvReader = new CsvReader(CSV_FILE); 30 | MongoDatabase database = new TaskMongoClient().getMongoDatabase(); 31 | MongoCollection studentsCollection = database.getCollection("universe"); 32 | studentsCollection.drop(); 33 | 34 | studentsCollection.insertMany(csvReader.createStudentList().stream() 35 | .map(Student::createDoc).collect(Collectors.toList())); 36 | 37 | System.out.println("Общее количество студентов в базе: " + studentsCollection.countDocuments()); 38 | 39 | List stList = studentsCollection.find(Filters.gt("Age", 40)).into(new ArrayList<>()); 40 | System.out.println("Количество студентов старше 40 лет: " + stList.size()); 41 | 42 | BsonDocument oneYoungestStudent = BsonDocument.parse("{Age: 1}"); 43 | System.out.println("Имя самого молодого студента: " 44 | + studentsCollection.find().sort(oneYoungestStudent).first().getString("Name")); 45 | 46 | BsonDocument oneOldestStudent = BsonDocument.parse("{Age: -1}"); 47 | System.out.println("Список курсов самого старого студента: " 48 | + studentsCollection.find().sort(oneOldestStudent).first().get("Courses")); 49 | 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_7/Task2/beans/Course.java: -------------------------------------------------------------------------------- 1 | package Homework_13_7.Task2.beans; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.io.Serializable; 8 | 9 | /** 10 | * Класс Course. 11 | * Реализация курса обучения. 12 | * @author Oleg Bech. 13 | * @email oleg071984@gmail.com 14 | */ 15 | @Data 16 | @AllArgsConstructor 17 | @NoArgsConstructor 18 | public class Course implements Serializable { 19 | 20 | private static final long serialVersionUID = 1L; 21 | 22 | private String name; 23 | } 24 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_7/Task2/beans/Student.java: -------------------------------------------------------------------------------- 1 | package Homework_13_7.Task2.beans; 2 | 3 | import lombok.Data; 4 | import lombok.NoArgsConstructor; 5 | import org.bson.Document; 6 | 7 | import java.io.Serializable; 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | import java.util.stream.Collectors; 11 | 12 | /** 13 | * Класс Student. 14 | * Реализация студента. 15 | * 16 | * @author Oleg Bech. 17 | * @email oleg071984@gmail.com 18 | */ 19 | @Data 20 | @NoArgsConstructor 21 | public class Student implements Serializable { 22 | 23 | private static final long serialVersionUID = 1L; 24 | 25 | private String name; 26 | private int age; 27 | private String courses; 28 | private List courseList = new ArrayList<>(); 29 | 30 | public Student(String name, int age, String courses) { 31 | this.name = name; 32 | this.age = age; 33 | this.courses = courses; 34 | } 35 | 36 | /** 37 | * Метод createDoc. 38 | * Создание Bson документа из бина. 39 | * @return Bson документ. 40 | */ 41 | public Document createDoc() { 42 | Document document = new Document(); 43 | document.put("Name", this.name); 44 | document.put("Age", this.age); 45 | document.put("Courses", this.courseList.stream() 46 | .map(course -> new Document().append("course:", course.getName())).collect(Collectors.toList())); 47 | return document; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_7/Task2/package-info.java: -------------------------------------------------------------------------------- 1 | package Homework_13_7.Task2; 2 | /* 3 | Напишите программу, которая получает на вход csv файл с данными о студентах: имя, возраст и список курсов через запятую, и вставляет эти данные в MongoDB. (csv файл приложен к этому уроку) 4 | 5 | После этого программа должна получить из БД и вывести на экран: 6 | 7 | — общее количество студентов в базе. 8 | 9 | — количество студентов старше 40 лет. 10 | 11 | — имя самого молодого студента. 12 | 13 | — список курсов самого старого студента. 14 | */ -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_7/TaskMongoClient.java: -------------------------------------------------------------------------------- 1 | package Homework_13_7; 2 | 3 | import com.mongodb.MongoClient; 4 | import com.mongodb.client.MongoDatabase; 5 | import lombok.Getter; 6 | 7 | @Getter 8 | public class TaskMongoClient { 9 | 10 | private final MongoClient mongoClient; 11 | private final MongoDatabase mongoDatabase; 12 | 13 | public TaskMongoClient() { 14 | this.mongoClient = new MongoClient("127.0.0.1", 27017); 15 | this.mongoDatabase = mongoClient.getDatabase("local"); 16 | } 17 | 18 | } 19 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_8/Task1/Book.java: -------------------------------------------------------------------------------- 1 | package Homework_13_8.Task1; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | @Data 7 | @AllArgsConstructor 8 | public class Book { 9 | 10 | private String name; 11 | private String author; 12 | private int year; 13 | } 14 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_8/Task1/FirstTaskRun.java: -------------------------------------------------------------------------------- 1 | package Homework_13_8.Task1; 2 | 3 | 4 | import Homework_13_8.TaskMongoClient; 5 | import com.mongodb.client.MongoCollection; 6 | import com.mongodb.client.MongoDatabase; 7 | import com.mongodb.client.model.Filters; 8 | import org.bson.BsonDocument; 9 | import org.bson.Document; 10 | 11 | import java.util.function.Consumer; 12 | import java.util.stream.Stream; 13 | /** 14 | * Класс TaskRun. 15 | * Демострация выполнения домашнего задания 13.8.1 16 | * @author Oleg Bech 17 | * @email oleg071984@gmail.com 18 | * * @see package-info.java 19 | */ 20 | public class FirstTaskRun { 21 | 22 | public static void main(String[] args) { 23 | 24 | MongoDatabase database = new TaskMongoClient().getMongoDatabase(); 25 | MongoCollection booksCollection = database.getCollection("books"); 26 | booksCollection.drop(); 27 | 28 | Stream bookStream = Stream.of( 29 | new Book("Философия Java", "Эккель Брюс", 2019), 30 | new Book("Искусство программирования на Java", "Герберт Шилдт", 2005), 31 | new Book("Java. Полное руководство", "Герберт Шилдт", 2018), 32 | new Book("Effective Java", "Блох Джошуа", 2008), 33 | new Book("Spring 4 Для профессионалов", "Крис Шеффер", 2015), 34 | new Book("Java Persistence with Hibernate. Second edition", "Кристиан Бауер", 2016) 35 | ); 36 | 37 | bookStream.forEach(book -> { 38 | booksCollection.insertOne( 39 | new Document() 40 | .append("name", book.getName()) 41 | .append("author", book.getAuthor()) 42 | .append("year", book.getYear()) 43 | ); 44 | }); 45 | 46 | //запрос на самую старую книгу 47 | System.out.println("Самая старая книга:"); 48 | BsonDocument oneOlderBookSortQuery = BsonDocument.parse("{year: 1}"); 49 | System.out.println(booksCollection.find().sort(oneOlderBookSortQuery).first()); 50 | //запрос на книги любимого автора 51 | System.out.println("Книги любимого автора:"); 52 | booksCollection.find(Filters.eq("author", "Герберт Шилдт")) 53 | .forEach((Consumer) System.out::println); 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_8/Task1/package-info.java: -------------------------------------------------------------------------------- 1 | package Homework_13_8.Task1; 2 | /* 3 | Установите mongodb и mongo-shell. 4 | 5 | Создайте коллекцию “books”, и добавьте в нее информацию о 5 ваших любимых книгах: 6 | 7 | Название, имя автора, и год создания. Добавьте как минимум две разных книги вашего любимого автора. 8 | 9 | — Напишите запрос для выбора одной самой старой книги из коллекции. 10 | 11 | — Напишите запрос, который выводит только книги вашего любимого автора. 12 | */ -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_8/Task2/CsvReader.java: -------------------------------------------------------------------------------- 1 | package Homework_13_8.Task2; 2 | 3 | import Homework_13_8.Task2.beans.Course; 4 | import Homework_13_8.Task2.beans.Student; 5 | import au.com.bytecode.opencsv.CSVReader; 6 | import au.com.bytecode.opencsv.bean.ColumnPositionMappingStrategy; 7 | import au.com.bytecode.opencsv.bean.CsvToBean; 8 | import lombok.AllArgsConstructor; 9 | 10 | import java.io.BufferedReader; 11 | import java.io.File; 12 | import java.io.FileNotFoundException; 13 | import java.io.FileReader; 14 | import java.util.Arrays; 15 | import java.util.List; 16 | import java.util.stream.Collectors; 17 | 18 | /** 19 | * Класс CsvReader. 20 | * Чтение csv файла. 21 | * @author Oleg Bech. 22 | * @email oleg071984@gmail.com 23 | */ 24 | @AllArgsConstructor 25 | public class CsvReader { 26 | 27 | private final File sourceCsvFile; 28 | private final CsvToBean csv = new CsvToBean(); 29 | 30 | /** 31 | * Метод ColumnPositionMappingStrategy. 32 | * Маппинг колонок csv файла. 33 | * @return ColumnPositionMappingStrategy. 34 | */ 35 | private static ColumnPositionMappingStrategy setColumMapping() { 36 | ColumnPositionMappingStrategy strategy = new ColumnPositionMappingStrategy(); 37 | strategy.setType(Student.class); 38 | String[] columns = new String[]{"name", "age", "courses"}; 39 | strategy.setColumnMapping(columns); 40 | return strategy; 41 | } 42 | 43 | /** 44 | * Метод createStudentList. 45 | * Создание коллекции студентов из заданного csv файла. 46 | * @return коллекция студентов. 47 | * @throws FileNotFoundException 48 | */ 49 | public List createStudentList() throws FileNotFoundException { 50 | 51 | CSVReader csvFileReader = new CSVReader(new BufferedReader(new FileReader(sourceCsvFile))); 52 | List stList = csv.parse(setColumMapping(), csvFileReader); 53 | stList.forEach(student -> student.setCourseList( 54 | Arrays.stream(student.getCourses().split(",")).map(Course::new).collect(Collectors.toList())) 55 | ); 56 | return stList; 57 | } 58 | } 59 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_8/Task2/TaskRun.java: -------------------------------------------------------------------------------- 1 | package Homework_13_8.Task2; 2 | 3 | import Homework_13_8.Task2.beans.Student; 4 | import Homework_13_8.TaskMongoClient; 5 | import com.mongodb.client.MongoCollection; 6 | import com.mongodb.client.MongoDatabase; 7 | import com.mongodb.client.model.Filters; 8 | import org.bson.BsonDocument; 9 | import org.bson.Document; 10 | 11 | import java.io.File; 12 | import java.io.FileNotFoundException; 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | import java.util.stream.Collectors; 16 | 17 | /** 18 | * Класс TaskRun. 19 | * Демострация выполнения домашнего задания 13.8.2 20 | * @author Oleg Bech 21 | * @email oleg071984@gmail.com 22 | * @see package-info.java 23 | */ 24 | public class TaskRun { 25 | 26 | private static final File CSV_FILE = new File("Stage13/src/main/java/Homework_13_7/Task2/mongo.csv"); 27 | 28 | public static void main(String[] args) throws FileNotFoundException { 29 | 30 | CsvReader csvReader = new CsvReader(CSV_FILE); 31 | MongoDatabase database = new TaskMongoClient().getMongoDatabase(); 32 | MongoCollection studentsCollection = database.getCollection("universe"); 33 | studentsCollection.drop(); 34 | 35 | studentsCollection.insertMany(csvReader.createStudentList().stream() 36 | .map(Student::createDoc).collect(Collectors.toList())); 37 | 38 | System.out.println("Общее количество студентов в базе: " + studentsCollection.countDocuments()); 39 | 40 | List stList = studentsCollection.find(Filters.gt("Age", 40)).into(new ArrayList<>()); 41 | System.out.println("Количество студентов старше 40 лет: " + stList.size()); 42 | 43 | BsonDocument oneYoungestStudent = BsonDocument.parse("{Age: 1}"); 44 | System.out.println("Имя самого молодого студента: " 45 | + studentsCollection.find().sort(oneYoungestStudent).first().getString("Name")); 46 | 47 | BsonDocument oneOldestStudent = BsonDocument.parse("{Age: -1}"); 48 | System.out.println("Список курсов самого старого студента: " 49 | + studentsCollection.find().sort(oneOldestStudent).first().get("Courses")); 50 | 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_8/Task2/beans/Course.java: -------------------------------------------------------------------------------- 1 | package Homework_13_8.Task2.beans; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | import lombok.NoArgsConstructor; 6 | 7 | import java.io.Serializable; 8 | 9 | /** 10 | * Класс Course. 11 | * Реализация курса обучения. 12 | * @author Oleg Bech. 13 | * @email oleg071984@gmail.com 14 | */ 15 | @Data 16 | @AllArgsConstructor 17 | @NoArgsConstructor 18 | public class Course implements Serializable { 19 | 20 | private static final long serialVersionUID = 1L; 21 | 22 | private String name; 23 | } 24 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_8/Task2/beans/Student.java: -------------------------------------------------------------------------------- 1 | package Homework_13_8.Task2.beans; 2 | 3 | import lombok.Data; 4 | import lombok.NoArgsConstructor; 5 | import org.bson.Document; 6 | 7 | import java.io.Serializable; 8 | import java.util.ArrayList; 9 | import java.util.List; 10 | import java.util.stream.Collectors; 11 | 12 | /** 13 | * Класс Student. 14 | * Реализация студента. 15 | * 16 | * @author Oleg Bech. 17 | * @email oleg071984@gmail.com 18 | */ 19 | @Data 20 | @NoArgsConstructor 21 | public class Student implements Serializable { 22 | 23 | private static final long serialVersionUID = 1L; 24 | 25 | private String name; 26 | private int age; 27 | private String courses; 28 | private List courseList = new ArrayList<>(); 29 | 30 | public Student(String name, int age, String courses) { 31 | this.name = name; 32 | this.age = age; 33 | this.courses = courses; 34 | } 35 | 36 | /** 37 | * Метод createDoc. 38 | * Создание Bson документа из бина. 39 | * @return Bson документ. 40 | */ 41 | public Document createDoc() { 42 | Document document = new Document(); 43 | document.put("Name", this.name); 44 | document.put("Age", this.age); 45 | document.put("Courses", this.courseList.stream() 46 | .map(course -> new Document().append("course:", course.getName())).collect(Collectors.toList())); 47 | return document; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_8/Task2/package-info.java: -------------------------------------------------------------------------------- 1 | package Homework_13_8.Task2; 2 | /* 3 | Напишите программу, которая получает на вход csv файл с данными о студентах: имя, возраст и список курсов через запятую, и вставляет эти данные в MongoDB. (csv файл приложен к этому уроку) 4 | 5 | После этого программа должна получить из БД и вывести на экран: 6 | 7 | — общее количество студентов в базе. 8 | 9 | — количество студентов старше 40 лет. 10 | 11 | — имя самого молодого студента. 12 | 13 | — список курсов самого старого студента. 14 | */ -------------------------------------------------------------------------------- /Stage13/src/main/java/Homework_13_8/TaskMongoClient.java: -------------------------------------------------------------------------------- 1 | package Homework_13_8; 2 | 3 | import com.mongodb.MongoClient; 4 | import com.mongodb.client.MongoDatabase; 5 | import lombok.Getter; 6 | 7 | /** 8 | * Класс TaskMongoClient. 9 | * Подключение к MongoDB. 10 | * @author Oleg Bech 11 | * @email oleg071984@gmail.com 12 | */ 13 | @Getter 14 | public class TaskMongoClient { 15 | 16 | private final MongoClient mongoClient; 17 | private final MongoDatabase mongoDatabase; 18 | 19 | public TaskMongoClient() { 20 | this.mongoClient = new MongoClient("127.0.0.1", 27017); 21 | this.mongoDatabase = mongoClient.getDatabase("local"); 22 | } 23 | 24 | } 25 | -------------------------------------------------------------------------------- /Stage14/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | SkillBox_Java 7 | ru.bechol 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | Stage14 13 | 14 | 15 | -------------------------------------------------------------------------------- /Stage14/src/main/java/Homework_14_7/Concatenation.java: -------------------------------------------------------------------------------- 1 | package Homework_14_7; 2 | 3 | public class Concatenation { 4 | public static void main(String[] args) { 5 | long start = System.currentTimeMillis(); 6 | StringBuilder builder = new StringBuilder(); 7 | for (int i = 0; i < 20_000; i++) { 8 | builder.append("some text some text some text"); 9 | } 10 | System.out.println(builder.toString().length()); 11 | System.out.println((System.currentTimeMillis() - start) + " ms"); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Stage14/src/main/java/Homework_14_7/Loader.java: -------------------------------------------------------------------------------- 1 | package Homework_14_7; 2 | 3 | import java.util.concurrent.ExecutorService; 4 | import java.util.concurrent.Executors; 5 | 6 | /** 7 | * Домашнее задание 14.7 8 | * 9 | * @author Oleg Bech 10 | * @email oleg071984@gmail.com 11 | * @see package-inf.java 12 | */ 13 | public class Loader { 14 | 15 | private static final int THREAD_AMOUNT = 15; 16 | private static final int REGION_AMOUNT = 100; 17 | 18 | public static void main(String[] args) throws Exception { 19 | if (THREAD_AMOUNT > 0 && REGION_AMOUNT > 0) { 20 | long start = System.currentTimeMillis(); 21 | int finishReqionCode = 0; 22 | int startRegionCode = 1; 23 | int z = REGION_AMOUNT - REGION_AMOUNT % THREAD_AMOUNT; 24 | char[] letters = {'У', 'К', 'Е', 'Н', 'Х', 'В', 'А', 'Р', 'О', 'С', 'М', 'Т'}; 25 | ExecutorService pool = Executors.newFixedThreadPool(THREAD_AMOUNT); 26 | for (int i = 0; i < THREAD_AMOUNT; i++) { 27 | finishReqionCode = z - ((z - finishReqionCode) - z / THREAD_AMOUNT); 28 | pool.submit(new FileWriterThread(startRegionCode, finishReqionCode, letters, i, start)); 29 | System.out.println(new StringBuilder("Thread#").append(i).append(" started. Write regions from ") 30 | .append(startRegionCode).append(" to ").append(finishReqionCode).toString()); 31 | startRegionCode = finishReqionCode; 32 | } 33 | if (z != REGION_AMOUNT) { 34 | pool.submit(new FileWriterThread(z, REGION_AMOUNT, letters, THREAD_AMOUNT, start)); 35 | System.out.println(new StringBuilder("Thread#").append(THREAD_AMOUNT).append(" started. Write regions from ") 36 | .append(z).append(" to ").append(REGION_AMOUNT).toString()); 37 | } 38 | pool.shutdown(); 39 | } else { 40 | System.out.println("Incorrect values of work parameters. Work stopped!"); 41 | } 42 | } 43 | 44 | } 45 | -------------------------------------------------------------------------------- /Stage14/src/main/java/Homework_14_7/package-info.java: -------------------------------------------------------------------------------- 1 | package Homework_14_7; 2 | /* 3 | Домашняя работа 14.7 4 | В проекте CarNumberGenerator внести сделанные в видео изменения и попробовать его дополнительно оптимизировать, 5 | реализовав вывод номеров одновременно в несколько файлов из нескольких потоков, а также оптимизировав метод padNumber(). 6 | Измерить время, определить, насколько программа стала работать быстрее или, наоборот, медленнее, и объяснить, почему. 7 | */ -------------------------------------------------------------------------------- /Stage15/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | SkillBox_Java 7 | ru.bechol 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | Stage15 12 | 13 | 7 14 | 7 15 | UTF-8 16 | 17 | 18 | 19 | org.apache.hadoop 20 | hadoop-hdfs 21 | 2.9.1 22 | 23 | 24 | org.apache.hadoop 25 | hadoop-client 26 | 2.9.1 27 | 28 | 29 | 30 | 31 | 32 | org.apache.maven.plugins 33 | maven-compiler-plugin 34 | 35 | 7 36 | 7 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /Stage15/src/main/java/Homework_15_4/Main.java: -------------------------------------------------------------------------------- 1 | package Homework_15_4; 2 | 3 | /** 4 | * Домашняя работа 15.4 5 | * @autor Oleg Bech. 6 | * @email oleg071984@gmail.com 7 | */ 8 | public class Main { 9 | private static final String HADOOP_CONNECTION_URI = "hdfs://0.0.0.0:19000"; 10 | 11 | public static void main(String[] args) throws Exception { 12 | 13 | FileAccess hadoop = new FileAccess(HADOOP_CONNECTION_URI); 14 | 15 | hadoop.create("test5/ok1.txt"); 16 | 17 | hadoop.append("test5/append_test1.txt", "\ntesting content for append"); 18 | 19 | 20 | System.out.println(hadoop.read("test5/append_test1.txt")); 21 | 22 | hadoop.delete("test5/append_test.txt"); 23 | 24 | if (hadoop.isDirectory("test5/append_test.txt")) { 25 | System.out.println("yes! it's directory!"); 26 | } else { 27 | System.out.println("Something goes wrong."); 28 | } 29 | 30 | System.out.println(hadoop.list("/")); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Stage16/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | SkillBox_Java 7 | ru.bechol 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | Stage16 13 | jar 14 | 15 | 11 16 | 11 17 | UTF-8 18 | 19 | 20 | 21 | 22 | com.google.guava 23 | guava 24 | 32.0.0-jre 25 | 26 | 27 | 28 | 29 | 30 | org.apache.maven.plugins 31 | maven-compiler-plugin 32 | 33 | 11 34 | 11 35 | 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /Stage16/src/main/java/Main.java: -------------------------------------------------------------------------------- 1 | import javax.swing.*; 2 | 3 | public class Main { 4 | 5 | 6 | public static void main(String[] args) { 7 | JFrame frame = new JFrame(); 8 | frame.setSize(600,130); 9 | frame.add(new MainForm().getMainPanel()); 10 | frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 11 | frame.setResizable(false); 12 | frame.setLocationRelativeTo(null); 13 | frame.setVisible(true); 14 | 15 | 16 | 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Stage18/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | SkillBox_Java 7 | ru.bechol 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | jar 12 | 13 | 11 14 | 11 15 | UTF-8 16 | 17 | Stage18 18 | 19 | 20 | 21 | junit 22 | junit 23 | 4.13.1 24 | test 25 | 26 | 27 | org.hamcrest 28 | hamcrest-all 29 | 1.3 30 | test 31 | 32 | 33 | -------------------------------------------------------------------------------- /Stage18/src/main/java/array_max_value/ArrayMaxValue.java: -------------------------------------------------------------------------------- 1 | package array_max_value; 2 | 3 | public class ArrayMaxValue 4 | { 5 | public static int getMaxValue(int[] values) 6 | { 7 | if(values.length > 0) { 8 | int maxValue = Integer.MIN_VALUE; 9 | for (int value : values) { 10 | if (value > maxValue) { 11 | maxValue = value; 12 | } 13 | } 14 | return maxValue; 15 | } 16 | return -1; 17 | } 18 | } -------------------------------------------------------------------------------- /Stage18/src/main/java/binary_search/BinarySearch.java: -------------------------------------------------------------------------------- 1 | package binary_search; 2 | 3 | import java.util.ArrayList; 4 | 5 | public class BinarySearch { 6 | private ArrayList list; 7 | 8 | public BinarySearch(ArrayList list) { 9 | this.list = list; 10 | } 11 | 12 | public int search(String query) { 13 | return search(query, 0, list.size() - 1); 14 | } 15 | 16 | private int search(String query, int from, int to) { 17 | int middle = (from + to) / 2; 18 | if (to < from) { 19 | return -1; 20 | } 21 | int comparsion = query.compareTo(list.get(middle)); 22 | if (comparsion == 0) { 23 | return middle; 24 | } 25 | if (comparsion > 0) { 26 | return search(query, middle + 1, to); 27 | } 28 | return search(query, from, middle - 1); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /Stage18/src/main/java/bubble_sort/BubbleSort.java: -------------------------------------------------------------------------------- 1 | package bubble_sort; 2 | 3 | public class BubbleSort 4 | { 5 | public static void sort(int[] array) 6 | { 7 | int n = array.length; 8 | int temp; 9 | for(int i = 0; i < n; i++) 10 | { 11 | for(int j = 1; j < n - i; j++) 12 | { 13 | if(array[j-1] > array[j]) 14 | { 15 | temp = array[j-1]; 16 | array[j-1] = array[j]; 17 | array[j] = temp; 18 | } 19 | } 20 | } 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Stage18/src/main/java/iteration_vs_recursion/IterationVsRecursion.java: -------------------------------------------------------------------------------- 1 | package iteration_vs_recursion; 2 | 3 | public class IterationVsRecursion 4 | { 5 | public static long calculateFactorial(long n) 6 | { 7 | if(n < 0) { 8 | throw new IllegalArgumentException("n value cannot be negative!"); 9 | } 10 | long result = 1; 11 | for(long i = n; i > 1; i--) { 12 | result = result * i; 13 | } 14 | return result; 15 | } 16 | 17 | public static long calculateFactorialRec(long n) 18 | { 19 | return (n <= 1) ? 1: 20 | n * calculateFactorialRec(n - 1); 21 | } 22 | } -------------------------------------------------------------------------------- /Stage18/src/main/java/merge_sort/MergeSort.java: -------------------------------------------------------------------------------- 1 | package merge_sort; 2 | 3 | public class MergeSort { 4 | public static void mergeSort(int[] array, int n) { 5 | if (n < 2) { 6 | return; 7 | } 8 | int middle = n / 2; 9 | int[] leftArray = new int[middle]; 10 | int[] rightArray = new int[n - middle]; 11 | 12 | for (int i = 0; i < middle; i++) { 13 | leftArray[i] = array[i]; 14 | } 15 | for (int i = middle; i < n; i++) { 16 | rightArray[i - middle] = array[i]; 17 | } 18 | mergeSort(leftArray, middle); 19 | mergeSort(rightArray, n - middle); 20 | 21 | merge(array, leftArray, rightArray, middle, n - middle); 22 | } 23 | 24 | public static void merge(int[] sourceArray, int[] leftArray, int[] rightArray, int left, int right) { 25 | 26 | int i = 0, j = 0, k = 0; 27 | while (i < left && j < right) { 28 | if (leftArray[i] <= rightArray[j]) { 29 | sourceArray[k++] = leftArray[i++]; 30 | } else { 31 | sourceArray[k++] = rightArray[j++]; 32 | } 33 | } 34 | while (i < left) { 35 | sourceArray[k++] = leftArray[i++]; 36 | } 37 | while (j < right) { 38 | sourceArray[k++] = rightArray[j++]; 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Stage18/src/main/java/quick_sort/QuickSort.java: -------------------------------------------------------------------------------- 1 | package quick_sort; 2 | 3 | public class QuickSort 4 | { 5 | public static void sort(int[] array) 6 | { 7 | if(array.length <= 1) { 8 | return; 9 | } 10 | sort(array, 0, array.length - 1); 11 | } 12 | 13 | private static void sort(int[] array, int from, int to) 14 | { 15 | if(from < to) 16 | { 17 | int pivot = partition(array, from, to); 18 | sort(array, from, pivot - 1); 19 | sort(array, pivot + 1, to); 20 | } 21 | } 22 | 23 | private static int partition(int[] array, int from, int to) 24 | { 25 | int pivot = array[from]; 26 | int i = from - 1; 27 | int j = to + 1; 28 | while (i < j) { 29 | for (i++; array[i] < pivot; i++); 30 | for (j--; array[j] > pivot; j--); 31 | if (i < j) { 32 | int temp = array[i]; 33 | array[i] = array[j]; 34 | array[j] = temp; 35 | } 36 | } 37 | return j; 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /Stage18/src/main/java/rabin_karp/RabinKarpExtended.java: -------------------------------------------------------------------------------- 1 | package rabin_karp; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | import java.util.Map; 6 | import java.util.TreeMap; 7 | import java.util.stream.Collectors; 8 | 9 | public class RabinKarpExtended { 10 | private String text; 11 | private TreeMap number2position = new TreeMap<>(); 12 | private int a = 256; // количество символов в алфавите 13 | private int q = 101; // некоторое простое число для вычисления хеша 14 | 15 | public RabinKarpExtended(String text) { 16 | this.text = text; 17 | } 18 | 19 | public List search(String pattern) { 20 | List indices; 21 | int patternLength = pattern.length(); //количество символов в паттерне 22 | int patternHash = 0; // вычисленный хеш для паттерна 23 | // вычисляем хеш паттерна 24 | for (int i = 0; i < patternLength; i++) { 25 | patternHash = (a * patternHash + pattern.charAt(i)) % q; 26 | } 27 | createIndex(patternLength); 28 | int finalQueryHash = patternHash; 29 | indices = number2position.entrySet().stream() 30 | .filter(entry -> { 31 | if (finalQueryHash == entry.getValue()) { 32 | int j; 33 | // сравниваем символы в строке и паттерне 34 | for (j = 0; j < patternLength; j++) { 35 | if (text.charAt(entry.getKey() + j) != pattern.charAt(j)) { 36 | break; 37 | } 38 | } 39 | return j == patternLength; 40 | } 41 | return false; 42 | }) 43 | .map(Map.Entry::getKey).collect(Collectors.toList()); 44 | return indices; 45 | } 46 | 47 | 48 | private void createIndex(int patternLength) { 49 | int h = 1; 50 | int pos; 51 | int textHash = 0; 52 | 53 | for (pos = 0; pos < patternLength - 1; pos++) 54 | h = (h * a) % q; 55 | for (pos = 0; pos < patternLength; pos++) { 56 | textHash = (a * textHash + text.charAt(pos)) % q; 57 | } 58 | for (pos = 0; pos <= text.length() - patternLength; pos++) { 59 | number2position.put(pos, textHash); 60 | if (pos < text.length() - patternLength) { 61 | textHash = (a * (textHash - text.charAt(pos) * h) + text.charAt(pos + patternLength)) % q; 62 | if (textHash < 0) 63 | textHash = (textHash + q); 64 | } 65 | } 66 | } 67 | } -------------------------------------------------------------------------------- /Stage18/src/test/java/BubbleSortTest.java: -------------------------------------------------------------------------------- 1 | import bubble_sort.BubbleSort; 2 | import org.junit.Test; 3 | import org.hamcrest.Matchers; 4 | import static org.junit.Assert.assertThat; 5 | 6 | public class BubbleSortTest { 7 | 8 | @Test 9 | public void whenBubbleSortArrayThenSortedArray() { 10 | int[] source = new int[]{14, 5, 7, 85, 25, 55, 23, 78}; 11 | BubbleSort.sort(source); 12 | int[] except = new int[]{5, 7, 14, 23, 25, 55, 78, 85}; 13 | assertThat(source, Matchers.is(except)); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Stage18/src/test/java/MergeSortTest.java: -------------------------------------------------------------------------------- 1 | import merge_sort.MergeSort; 2 | import org.hamcrest.Matchers; 3 | import org.junit.Test; 4 | import quick_sort.QuickSort; 5 | 6 | import static org.junit.Assert.assertThat; 7 | 8 | public class MergeSortTest { 9 | 10 | @Test 11 | public void whenMergeSortArrayThenSortedArray() { 12 | int[] source = new int[]{5, 7, 4, 8, 3, 2}; 13 | MergeSort.mergeSort(source, source.length); 14 | int[] except = new int[]{2, 3, 4, 5, 7, 8}; 15 | assertThat(source, Matchers.is(except)); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Stage18/src/test/java/QuickSortTest.java: -------------------------------------------------------------------------------- 1 | import org.junit.Test; 2 | import org.hamcrest.Matchers; 3 | import quick_sort.QuickSort; 4 | 5 | import static org.junit.Assert.assertThat; 6 | 7 | public class QuickSortTest { 8 | 9 | @Test 10 | public void whenQuickSortArrayThenSortedArray() { 11 | int[] source = new int[]{5, 7, 4, 8, 3, 2}; 12 | QuickSort.sort(source); 13 | int[] except = new int[]{2, 3, 4, 5, 7, 8}; 14 | assertThat(source, Matchers.is(except)); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /Stage18/src/test/java/RabinKarpTest.java: -------------------------------------------------------------------------------- 1 | import org.hamcrest.Matchers; 2 | import org.junit.Test; 3 | import rabin_karp.RabinKarpExtended; 4 | 5 | import java.util.Collections; 6 | import java.util.List; 7 | 8 | import static org.junit.Assert.assertThat; 9 | 10 | public class RabinKarpTest { 11 | 12 | @Test 13 | public void whenRabinKarpFindSubStringThenReturnArrayOfIndexes() { 14 | RabinKarpExtended rabinKarpExtended = new RabinKarpExtended("Skillbox"); 15 | List actualIndexes = rabinKarpExtended.search("box"); 16 | List expectedIndexes = Collections.singletonList(5); 17 | assertThat(actualIndexes, Matchers.is(expectedIndexes)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Stage19/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | SkillBox_Java 7 | ru.bechol 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | jar 12 | 13 | 11 14 | 11 15 | UTF-8 16 | 17 | Stage19 18 | 19 | 20 | 21 | junit 22 | junit 23 | 4.13.1 24 | test 25 | 26 | 27 | org.hamcrest 28 | hamcrest-all 29 | 1.3 30 | test 31 | 32 | 33 | -------------------------------------------------------------------------------- /Stage19/src/main/java/Homework_19_5/DoubleLinkedList/DoubleListNode.java: -------------------------------------------------------------------------------- 1 | package Homework_19_5.DoubleLinkedList; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | /** 7 | * Класс DoubleListNode. 8 | * Элемент двусвязанного списка. 9 | */ 10 | @Data 11 | class DoubleListNode { 12 | 13 | private String data; 14 | private DoubleListNode prev; 15 | private DoubleListNode next; 16 | 17 | public DoubleListNode(String data) { 18 | this.data = data; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /Stage19/src/main/java/Homework_19_5/SingleLinkedList/SingleLinkedList.java: -------------------------------------------------------------------------------- 1 | package Homework_19_5.SingleLinkedList; 2 | 3 | /** 4 | * Класс SingleLinkedList. 5 | * Класс для работы с односвязанным списком. 6 | */ 7 | public class SingleLinkedList { 8 | private SingleListNode topNode; 9 | 10 | /** 11 | * Метод push. 12 | * Доавбление элемента в список. 13 | * @param node элемент списка. 14 | */ 15 | public void push(SingleListNode node) { 16 | if (topNode != null) { 17 | node.setNext(topNode); 18 | } 19 | topNode = node; 20 | } 21 | 22 | /** 23 | * Метод pop(). 24 | * Извлечение элемента из списка. 25 | * @return элемент списка. 26 | */ 27 | public SingleListNode pop() { 28 | SingleListNode node = topNode; 29 | if (topNode != null) { 30 | topNode = topNode.getNext(); 31 | node.setNext(null); 32 | } 33 | return node; 34 | } 35 | 36 | /** 37 | * Метод removeTop(). 38 | * Удаление верхнего элемента списка. 39 | */ 40 | public void removeTop() { 41 | if (topNode != null) { 42 | topNode = topNode.getNext(); 43 | } 44 | } 45 | 46 | /** 47 | * Метод removeLast(). 48 | * Удаление последнего элемента списка. 49 | */ 50 | public void removeLast() { 51 | if (topNode != null) { 52 | if (topNode.getNext() != null) { 53 | SingleListNode previous = topNode; 54 | SingleListNode current = topNode.getNext(); 55 | while (current.getNext() != null) { 56 | previous = current; 57 | current = current.getNext(); 58 | } 59 | previous.setNext(null); 60 | } 61 | } 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /Stage19/src/main/java/Homework_19_5/SingleLinkedList/SingleListNode.java: -------------------------------------------------------------------------------- 1 | package Homework_19_5.SingleLinkedList; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | /** 7 | * Класс SingleListNode 8 | * Элемент односвязного списка. 9 | */ 10 | @Data 11 | public class SingleListNode { 12 | 13 | private String data; 14 | private SingleListNode next; 15 | 16 | public SingleListNode(String data) { 17 | this.data = data; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Stage19/src/main/java/Homework_19_6/BinaryTree.java: -------------------------------------------------------------------------------- 1 | package Homework_19_6; 2 | 3 | import java.util.ArrayList; 4 | import java.util.List; 5 | 6 | /** 7 | * Класс BinaryTree. 8 | * Методы для работы с бинарным деревом. 9 | */ 10 | public class BinaryTree 11 | { 12 | private Node root; 13 | 14 | /** 15 | * Метод addNode. 16 | * Добавление элемента. 17 | * @param data данные для добавления. 18 | */ 19 | public void addNode(String data) 20 | { 21 | if (root == null) { 22 | root = new Node(data); 23 | } else { 24 | Node parent = root; 25 | while (true) { 26 | if (data.compareTo(parent.getData()) < 0) { 27 | if (parent.getLeft() == null) { 28 | Node newNode = new Node(data); 29 | newNode.setParent(parent); 30 | parent.setLeft(newNode); 31 | break; 32 | } else { 33 | parent = parent.getLeft(); 34 | } 35 | } else { 36 | if (parent.getRight() == null) { 37 | Node newNode = new Node(data); 38 | newNode.setParent(parent); 39 | parent.setRight(newNode); 40 | break; 41 | } else { 42 | parent = parent.getRight(); 43 | } 44 | } 45 | } 46 | } 47 | } 48 | 49 | /** 50 | * Метод searchNodes. 51 | * Поиск элементов дерева. 52 | * @param data искомое значениею. 53 | * @return список значений. 54 | */ 55 | public List searchNodes(String data) 56 | { 57 | List resultList = new ArrayList<>(); 58 | if (root != null) { 59 | Node parent = root; 60 | while (true) { 61 | if (data.compareTo(parent.getData()) < 0) { 62 | Node left = parent.getLeft(); 63 | if (left == null) { 64 | break; 65 | } else { 66 | parent = left; 67 | continue; 68 | } 69 | } 70 | if (data.compareTo(parent.getData()) >= 0) { 71 | if (data.equals(parent.getData())) resultList.add(parent); 72 | Node right = parent.getRight(); 73 | if (right == null) { 74 | break; 75 | } else { 76 | parent = right; 77 | } 78 | } 79 | } 80 | } 81 | return resultList; 82 | } 83 | } -------------------------------------------------------------------------------- /Stage19/src/main/java/Homework_19_6/Node.java: -------------------------------------------------------------------------------- 1 | package Homework_19_6; 2 | 3 | import lombok.Data; 4 | 5 | /** 6 | * Класс Node. 7 | * Элемент бинарного дерева. 8 | */ 9 | @Data 10 | public class Node { 11 | private String data; 12 | 13 | private Node parent; 14 | private Node left; 15 | private Node right; 16 | 17 | public Node(String data) { 18 | this.data = data; 19 | } 20 | 21 | @Override 22 | public String toString() { 23 | String parentData = parent != null ? parent.getData() : null; 24 | String leftData = left != null ? left.getData() : null; 25 | String rightData = right != null ? right.getData() : null; 26 | return "Node{" + 27 | "data='" + data + '\'' + 28 | ", parent=" + parentData + 29 | ", left=" + leftData + 30 | ", right=" + rightData + 31 | '}'; 32 | } 33 | 34 | } -------------------------------------------------------------------------------- /Stage19/src/main/java/Homework_19_7/Node.java: -------------------------------------------------------------------------------- 1 | package Homework_19_7; 2 | 3 | import lombok.Data; 4 | 5 | import java.util.ArrayList; 6 | import java.util.List; 7 | 8 | @Data 9 | public class Node { 10 | private String text; 11 | private List children; 12 | private int position; 13 | 14 | public Node(String word, int position) { 15 | this.text = word; 16 | this.position = position; 17 | this.children = new ArrayList<>(); 18 | } 19 | 20 | } -------------------------------------------------------------------------------- /Stage4/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | SkillBox_Java 7 | ru.bechol 8 | 1.0-SNAPSHOT 9 | 10 | 4.0 Числа, строки и даты 11 | 12 | 13 | 14 | org.apache.maven.plugins 15 | maven-compiler-plugin 16 | 17 | 8 18 | 8 19 | 20 | 21 | 22 | 23 | 4.0.0 24 | Stage4 25 | -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_41/Container.java: -------------------------------------------------------------------------------- 1 | package homework_41; 2 | 3 | public class Container 4 | { 5 | public int count; 6 | } -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_41/Main.java: -------------------------------------------------------------------------------- 1 | package homework_41; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | Container container = new Container(); 6 | container.count += 7843; 7 | 8 | System.out.println(new Main().sumDigits(7345)); 9 | } 10 | 11 | public Integer sumDigits(Integer number) { 12 | int sum = 0; 13 | for (int i = 0; i < number.toString().length(); i++) { 14 | sum += Character.getNumericValue(number.toString().charAt(i)); 15 | } 16 | return sum; 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_41/package-info.java: -------------------------------------------------------------------------------- 1 | package homework_41; 2 | /** 3 | * > Запустите код проекта IntegerExperiments, увидьте ошибку и исправьте её заменой Integer на int. 4 | * > Реализуйте метод sumDigits так, чтобы он считал сумму цифр в числе, используя метод 5 | * Integer.toString и методы строки charAt() и length(). 6 | */ 7 | -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_42/Main.java: -------------------------------------------------------------------------------- 1 | package homework_42; 2 | 3 | public class Main { 4 | public static void main(String[] args) { 5 | System.out.println("Вывод в консоль в формате: ТИП MIN/MAX"); 6 | System.out.println(Byte.TYPE.toString().toUpperCase() + " " + Byte.MIN_VALUE + "/" + Byte.MAX_VALUE); 7 | System.out.println(Short.TYPE.toString().toUpperCase() + " " + Short.MIN_VALUE + "/" + Short.MAX_VALUE); 8 | System.out.println(Integer.TYPE.toString().toUpperCase() + " " + Integer.MIN_VALUE + "/" + Integer.MAX_VALUE); 9 | System.out.println(Long.TYPE.toString().toUpperCase() + " " + Long.MIN_VALUE + "/" + Long.MAX_VALUE); 10 | System.out.println(Float.TYPE.toString().toUpperCase() + " " + Float.MIN_VALUE + "/" + Float.MAX_VALUE); 11 | System.out.println(Double.TYPE.toString().toUpperCase() + " " + Double.MIN_VALUE + "/" + Double.MAX_VALUE); 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_42/package-info.java: -------------------------------------------------------------------------------- 1 | package homework_42; 2 | /** 3 | *Распечатать и написать в качестве ответа к домашнему заданию максимальные и минимальные значения всех типов чисел. 4 | */ -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_43/RedCross.java: -------------------------------------------------------------------------------- 1 | package homework_43; 2 | 3 | import java.util.InputMismatchException; 4 | import java.util.Scanner; 5 | 6 | public class RedCross { 7 | private static final int TRACK_CAPACITY = 12; 8 | private static final int CONTAINER_CAPACITY = 27; 9 | 10 | public static void main(String[] args) { 11 | while (true) { 12 | try { 13 | System.out.println("Введите количество ящиков с гуманитарной помощью: "); 14 | int boxAmount = (new Scanner(System.in)).nextInt(); 15 | 16 | if (!checkInput(boxAmount)) { 17 | printAlert("значение должно быть больше нуля."); 18 | continue; 19 | } 20 | 21 | for (int i = 0; i < boxAmount; i++) { 22 | if (i % (TRACK_CAPACITY * CONTAINER_CAPACITY) == 0) { 23 | System.out.println("Грузовик " + (i / TRACK_CAPACITY / CONTAINER_CAPACITY + 1) + ":"); 24 | } 25 | if (i % CONTAINER_CAPACITY == 0) { 26 | System.out.println("\tКонтейнер " + (i / CONTAINER_CAPACITY + 1) + ":"); 27 | } 28 | System.out.println("\t\tЯщик " + (i + 1)); 29 | } 30 | } catch (InputMismatchException ime) { 31 | printAlert("значение должно быть целым числом."); 32 | } 33 | } 34 | } 35 | 36 | 37 | private static boolean checkInput(int value) { 38 | return value > 0; 39 | } 40 | 41 | private static void printAlert(String str) { 42 | System.out.println("!> " + str); 43 | } 44 | 45 | } 46 | -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_43/package-info.java: -------------------------------------------------------------------------------- 1 | package homework_43; 2 | /* 3 | > Почитать документацию к классу Math на официальном сайте Oracle. 4 | > Вы доставляете гуманитарную помощь в виде ящиков одинакового размера. 5 | У вас есть грузовики и контейнеры. В каждый грузовик влезает максимум 12 контейнеров. 6 | В каждый контейнер - не более 27 ящиков. Ящики, контейнеры и грузовики пронумерованы. 7 | Напишите программу, которая будет распределять ящики по контейнерам и грузовикам в зависимости 8 | от их количества, а также напечатает, сколько всего нужно грузовиков и контейнеров. 9 | На вход программы через консоль должно подаваться число ящиков. 10 | На выходе результат должен выглядеть следующим образом: 11 | 12 | Грузовик 1: 13 | 14 | Контейнер 1: 15 | 16 | Ящик 1 17 | 18 | Ящик 2 19 | 20 | Ящик 3 21 | 22 | … 23 | 24 | Контейнер 2 25 | 26 | Ящик 28 27 | 28 | Ящик 29 29 | */ -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_44/Alphabet/Alphabet.java: -------------------------------------------------------------------------------- 1 | package homework_44.Alphabet; 2 | 3 | /** 4 | * 4.4.1 5 | */ 6 | public class Alphabet { 7 | public static void main(String[] args) { 8 | for (char i = 'a'; i < 'z'; i++) { 9 | System.out.println(i + " code: " + Character.getNumericValue(i)); 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_44/SimpleFioService/Main.java: -------------------------------------------------------------------------------- 1 | package homework_44.SimpleFioService; 2 | 3 | import java.util.Scanner; 4 | 5 | /** 6 | * 4.4.3 и задание со звездочкой 7 | */ 8 | public class Main { 9 | public static void main(String[] args) { 10 | while (true) { 11 | System.out.println("Введите ФИО в формате <Фамилия Имя Отчество>:"); 12 | String fullName = new Scanner(System.in).nextLine().trim(); 13 | 14 | if (!checkFullName(fullName)) { 15 | System.out.println("!> Неверный формат ФИО"); 16 | continue; 17 | } 18 | 19 | String familyString = fullName.substring(0, fullName.indexOf(" ")).trim(); 20 | String nameString = fullName.substring(fullName.indexOf(" "), fullName.lastIndexOf(" ")).trim(); 21 | String patronymicString = fullName.substring(fullName.lastIndexOf(" "), fullName.length()).trim(); 22 | 23 | if (checkUpperCase(familyString)) 24 | System.out.println("Фамилия: " + familyString); 25 | if (checkUpperCase(nameString)) 26 | System.out.println("Имя: " + nameString); 27 | if (checkUpperCase(patronymicString)) 28 | System.out.println("Отчество: " + patronymicString); 29 | } 30 | } 31 | 32 | /** 33 | * Проверяем, начинается ли слово с заглавной буквы. 34 | * @param str слово 35 | * @return true - если слово начинается с заглавной 36 | */ 37 | private static boolean checkUpperCase(String str) { 38 | return !str.isEmpty() && Character.isUpperCase(str.toCharArray()[0]); 39 | } 40 | 41 | /** 42 | * Проверяем ввод пользователя. 43 | * @param str строка, введенная пользователем. 44 | * @return true если введенная строка содержит 2 пробела и расстояние между ними минимум 2 символа. 45 | */ 46 | private static boolean checkFullName(String str) { 47 | return (str.trim().lastIndexOf(" ") - str.trim().indexOf(" ") > 2); 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_44/StringExperiments/StringExperiments.java: -------------------------------------------------------------------------------- 1 | package homework_44.StringExperiments; 2 | 3 | /** 4 | * 4.4.2 5 | */ 6 | public class StringExperiments { 7 | private static String first = "5000"; 8 | private static String second = "30000"; 9 | public static void main(String[] args) { 10 | String text = "Вася заработал 5000 рублей, Петя - 7563 рубля, а Маша - 30000 рублей"; 11 | int vasiaSalary = Integer.parseInt(text.substring(text.indexOf(first), text.indexOf("рублей")).trim()); 12 | int mashaSalary = Integer.parseInt(text.substring(text.indexOf(second), text.lastIndexOf("рублей")).trim()); 13 | System.out.println("Сумма заработка Васи и Маши: " + (vasiaSalary + mashaSalary)); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_44/package-info.java: -------------------------------------------------------------------------------- 1 | package homework_44; 2 | /* 3 | 4.4.1 Распечатать коды всех латинских букв и сами буквы. 4 | 4.4.2 С помощью методов indexOf(), lastIndexOf(), substring() и trim() написать код в проекте StringExperiments, 5 | который считает сумму заработка Васи и Маши. 6 | 4.4.3 Написать программу, которая на входе через консоль принимает фамилию, имя и отчество одной строкой (например, 7 | “Иванов Сергей Петрович”) и выводит фамилию, имя и отчество отдельно в следующем формате: 8 | Фамилия: Иванов 9 | Имя: Сергей 10 | Отчество: Петрович 11 | 4.4.4* Программу разделения строки на фамилию, имя и отчество сделать устойчивой к ошибкам - к неверным форматам ввода. 12 | */ -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_45/EnglishReader/Main.java: -------------------------------------------------------------------------------- 1 | package homework_45.EnglishReader; 2 | 3 | import java.util.Arrays; 4 | 5 | /** 6 | * 4.5.2 7 | */ 8 | public class Main { 9 | 10 | private static final String text = "A means should also be available for tabulating the failure information " + 11 | "for determining trends and the mean-time-between-failure of the equipment. Besides being useful " + 12 | "to design and reliability engineering, this information may also be useful to maintenance personnel for " + 13 | "determining maintenance periodicity of the equipment already in use. Failures that require stress " + 14 | "statements shall include test failures, operator induced failures, test equipment failures, " + 15 | "environmental equipment failures, or any other problem which did result in overstress, " + 16 | "or which could have resulted in overstress, to any portion of flight hardware." + 17 | "The KSC PRACA System provides the means to monitor and track the health of the Space " + 18 | "Shuttle Ground Support Equipment and identify problem areas that require further investigation. " + 19 | "See figure 2 for the report that is used to identify and track problems at KSC. The majority of " + 20 | "problems that are reported deal with component failures. However, any other condition that " + 21 | "results in the system or equipment not meeting the requirements that were specified is also " + 22 | "reported (corrosion, out-of-calibration, etc.)."; 23 | 24 | public static void main(String[] args) { 25 | Arrays.asList(text.split(" ")).forEach(System.out::println); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_45/RegexFioParser/Main.java: -------------------------------------------------------------------------------- 1 | package homework_45.FioParser; 2 | 3 | import java.util.Scanner; 4 | 5 | /** 6 | * 4.5.3 7 | */ 8 | public class Main { 9 | private static final String[] FIO_DETAILS = {"Фамилия", "Имя", "Отчество"}; 10 | 11 | public static void main(String[] args) { 12 | while (true) { 13 | System.out.println("Введите фамилию имя и отчество человека в формате <Фамилия Имя Отчество>:"); 14 | String userInput = (new Scanner(System.in).nextLine()); 15 | if (!checkString(userInput)) { 16 | System.out.println("!> строка не соответствует предложенному формату"); 17 | continue; 18 | } 19 | String[] fioArr = userInput.split(" "); 20 | for (int i = 0; i < fioArr.length; i++) 21 | System.out.println(FIO_DETAILS[i] + ": " + fioArr[i]); 22 | } 23 | } 24 | 25 | private static boolean checkString(String fio) { 26 | /* 4.4.4* Проверка формата ввода */ 27 | String mask = "^[А-Я&&[^ЬЪ]][а-я&&[^ъ]]+(ов|ова|ёв|ёва|ев|ева|ин|ина|ын|ына|их|ых|ский|ская|цкий|цкая|ь) " + 28 | "[А-Я&&[^ЬЪ]][а-я&&[^ъ]]+ [А-Я&&[^ЬЪ]][а-я&&[^ъ]]+(ович|евич|ич|овна|евна|ична|инична)$"; 29 | return fio.matches(mask); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_45/StringExperiments/Main.java: -------------------------------------------------------------------------------- 1 | package homework_45.StringExperiments; 2 | 3 | import java.util.regex.Matcher; 4 | import java.util.regex.Pattern; 5 | 6 | /** 7 | * 4.5.1 8 | */ 9 | public class Main { 10 | public static void main(String[] args) { 11 | String text = "Вася заработал 5000 рублей, Петя - 7563 рубля, а Маша - 30000 рублей"; 12 | int sum = 0; 13 | Pattern pattern = Pattern.compile("\\d+"); 14 | Matcher matcher = pattern.matcher(text); 15 | while (matcher.find()) 16 | sum += Integer.parseInt(text.substring(matcher.start(), matcher.end())); 17 | System.out.println("Общая сумма заработка всех: " + sum); 18 | } 19 | } 20 | 21 | -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_45/TelNum/Main.java: -------------------------------------------------------------------------------- 1 | package homework_45.TelNum; 2 | 3 | import java.util.Scanner; 4 | import java.util.regex.Matcher; 5 | import java.util.regex.Pattern; 6 | 7 | /** 8 | * 4.5.4 9 | */ 10 | public class Main { 11 | public static void main(String[] args) { 12 | while (true) { 13 | System.out.println("Введите номер телефона: "); 14 | String telNum = new Scanner(System.in).nextLine(); 15 | Pattern pattern = Pattern.compile("\\d+"); 16 | Matcher matcher = pattern.matcher(telNum); 17 | StringBuilder sb = new StringBuilder(); 18 | while (matcher.find()) 19 | sb.append(telNum.substring(matcher.start(), matcher.end())); 20 | try { 21 | System.out.println(sb.toString().substring(0, 11)); 22 | } catch (StringIndexOutOfBoundsException ex) { 23 | System.out.println("!> Слишком коротуий номер."); 24 | } 25 | } 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_45/package-info.java: -------------------------------------------------------------------------------- 1 | package homework_45; 2 | /* 3 | 4.5.1 В проекте StringExperiments внести изменения таким образом, чтобы суммы заработков каждого 4 | человека извлекались из текста регулярным выражением, а в конце программы рассчитывалась и 5 | распечатываль общая сумма заработка всех. Приложить zip-архив изменённого проекта StringExperiments. 6 | 4.5.2 Возьмите английский текст (не менее 100 слов) и напишите программу, которая будет разбивать его 7 | на слова и печатать слова в консоли. Приложить zip-архив проекта. 8 | 4.5.3 Исправьте программу, написанную в уроке 4, таким образом, чтобы вводимая строка с фамилией, 9 | именем и отчеством разбивались с использованием регулярного выражения. Приложить zip-архив проекта. 10 | 4.5.4 Реализовать очистку номера телефона, вводимого из консоли, от лишних символов, чтобы его можно было 11 | вводить не только в формате 79091234567, но и с использованием лишних символов, например: 12 | +7 909 123-45-67 13 | +7 (909) 1234567 14 | 7-909-123-45-67 15 | 8 905 1234567 16 | */ -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_46/BirthDay/Main.java: -------------------------------------------------------------------------------- 1 | package homework_46.BirthDay; 2 | 3 | import java.text.SimpleDateFormat; 4 | import java.util.Calendar; 5 | import java.util.Date; 6 | import java.util.GregorianCalendar; 7 | 8 | /** 9 | * 4.6 10 | */ 11 | public class Main { 12 | 13 | private static Calendar myBirthDate = Calendar.getInstance(); 14 | 15 | public static void main(String[] args) { 16 | myBirthDate.set(1984, Calendar.JULY, 11); 17 | Date today = Calendar.getInstance().getTime(); 18 | for (int i = 0; myBirthDate.getTime().before(today); i++) { 19 | System.out.println(i + " - " + new SimpleDateFormat("d.MM.y '-' E").format(myBirthDate.getTime())); 20 | myBirthDate.set(Calendar.YEAR, myBirthDate.get(Calendar.YEAR) + 1); 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /Stage4/src/main/java/homework_46/package-info.java: -------------------------------------------------------------------------------- 1 | package homework_46; 2 | 3 | /* 4 | Написать программу, которая будет распечатывать Ваш возраст и соответствующий ему день рождения 5 | и день недели до текущего момента времени. Формат: 6 | 0 - 13.02.1989 - Mon 7 | 1 - 13.02.1990 - Tue 8 | */ -------------------------------------------------------------------------------- /Stage5/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | SkillBox_Java 7 | ru.bechol 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | 12 | Stage5 13 | 14 | 15 | -------------------------------------------------------------------------------- /Stage5/src/main/java/homework_51/ArrayX.java: -------------------------------------------------------------------------------- 1 | package homework_51; 2 | 3 | /** 4 | * 5.1.3 5 | * 6 | * @see package-info.java 7 | */ 8 | public class ArrayX { 9 | private static final int SQUARE_SIZE = 7; 10 | 11 | public static void main(String[] args) { 12 | String[][] arr = new String[SQUARE_SIZE][SQUARE_SIZE]; 13 | for (int i = 0; i < SQUARE_SIZE; i++) { 14 | for (int j = 0; j < SQUARE_SIZE; j++) { 15 | if (i == j || (i + j + 1) == SQUARE_SIZE) { 16 | arr[i][j] = "x"; 17 | } else { 18 | arr[i][j] = " "; 19 | } 20 | System.out.print(arr[i][j]); 21 | 22 | } 23 | System.out.println("\n"); 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /Stage5/src/main/java/homework_51/HospitalAvgTemperature.java: -------------------------------------------------------------------------------- 1 | package homework_51; 2 | 3 | import java.util.Random; 4 | 5 | /** 6 | * 5.1.2 7 | * 8 | * @see package-info.java 9 | */ 10 | public class HospitalAvgTemperature { 11 | private static int amount = 30, low = 32, high = 40; 12 | 13 | public static void main(String[] args) { 14 | int tempSum = 0; 15 | int count = 0; 16 | double[] temperatureArray = initTemperatureArray(amount, low, high); 17 | for (int i = 0; i < temperatureArray.length; i++) { 18 | tempSum += temperatureArray[i]; 19 | if (temperatureArray[i] > 36.2 && temperatureArray[i] < 36.9) 20 | count++; 21 | } 22 | System.out.println("Средняя температура по больнице: " + tempSum / amount); 23 | System.out.println("Количество здоровых пациентов: " + count); 24 | } 25 | 26 | /** 27 | * Метод для генерации массива температур пациентов в диапазоне. 28 | * 29 | * @param amount - количество значений (размер массива). 30 | * @param low минимальное значение температуры. 31 | * @param high максимальное значение температуры. 32 | * @return массив с температурами пациентов в диапазоне. 33 | */ 34 | private static double[] initTemperatureArray(int amount, int low, int high) { 35 | double[] result = new double[amount]; 36 | for (int i = 0; i < amount; i++) { 37 | result[i] = low + Math.random() * (high - low); 38 | } 39 | return result; 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Stage5/src/main/java/homework_51/ReverseArray.java: -------------------------------------------------------------------------------- 1 | package homework_51; 2 | 3 | import java.util.Arrays; 4 | 5 | /** 6 | * 5.1.1 7 | * 8 | * @see package-info.java 9 | */ 10 | public class ReverseArray { 11 | public static void main(String[] args) { 12 | String[] rainbowColors = {"Красный", "Оранжевый", "Желтый"}; 13 | String[] reverseRainbowColors = new String[rainbowColors.length]; 14 | for (int i = 0; i < rainbowColors.length; i++) { 15 | reverseRainbowColors[i] = rainbowColors[rainbowColors.length - i - 1]; 16 | } 17 | System.out.println(Arrays.toString(reverseRainbowColors)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /Stage5/src/main/java/homework_51/package-info.java: -------------------------------------------------------------------------------- 1 | package homework_51; 2 | /* 3 | 5.1.1 Повторить создание массива и заполнение цветами радуги, как показано в видео, а затем написать код, 4 | переворачивающий этот массив. 5 | 5.1.2 Создать массив с температурами 30-ти пациентов (от 32 до 40 градусов). Написать код, рассчитывающий 6 | среднюю температуру по больнице и количество здоровых пациентов (с температурой от 36,2 до 36,9). 7 | 5.1.3 Создать с помощью циклов массив массивов строк таким образом, чтобы при его распечатке в консоли 8 | печатался крестик из крестиков: 9 | x x 10 | 11 | x x 12 | 13 | x x 14 | 15 | x 16 | 17 | x x 18 | 19 | x x 20 | 21 | x x 22 | */ -------------------------------------------------------------------------------- /Stage5/src/main/java/homework_53/EmailList.java: -------------------------------------------------------------------------------- 1 | package homework_53; 2 | 3 | import java.util.HashSet; 4 | import java.util.Scanner; 5 | import java.util.regex.Pattern; 6 | 7 | /** 8 | * 5.3 9 | * Написать программу, в которой будет хранится перечень e-mail-ов. 10 | * E-mail’ы можно добавлять через консоль командой ADD и печатать весь список командой LIST. 11 | * * Проверять корректность вводимых e-mail’ов и в случае необходимости печатать сообщение об ошибке. 12 | * 13 | * @author Oleg Bech 14 | * @email oleg071984@gmail.com 15 | */ 16 | public class EmailList { 17 | /*строка, вводимая пользователем*/ 18 | private static String userInput; 19 | /*сет почтовых адресов*/ 20 | private static HashSet emailSet = new HashSet<>(); 21 | 22 | public static void main(String[] args) { 23 | emailSetInit(); 24 | while (true) { 25 | System.out.println("Введите команду:"); 26 | userInput = new Scanner(System.in).nextLine(); 27 | if (!checkUserInput(userInput)) { 28 | System.out.println("!> введена неправильная команда"); 29 | continue; 30 | } 31 | if (userInput.matches("LIST")) { 32 | emailSet.forEach(System.out::println); 33 | } else if (userInput.matches("^ADD\\s[\\w-\\+]+(\\.[\\w]+)*@[\\w-]+(\\.[\\w]+)*(\\.[a-z]{2,})$")) { 34 | if (!emailSet.add(userInput.split("\\s")[1])) 35 | System.out.println("Указанный email есть в списке."); 36 | } else if (userInput.matches("EXIT")) { 37 | System.out.println("Завершение работы."); 38 | System.exit(0); 39 | } else { 40 | System.out.println("Ошибка в синтаксисе команды."); 41 | } 42 | } 43 | } 44 | 45 | /** 46 | * Метод emailSetInit(). 47 | * Загрузка в emailSet значений по умолчанию. 48 | */ 49 | private static void emailSetInit() { 50 | emailSet.add("oleg071984@gmail.com"); 51 | emailSet.add("abc@mail.ru"); 52 | emailSet.add("ok@yandex.ru"); 53 | } 54 | 55 | /** 56 | * Метод checkUserInput(String input). 57 | * Проверка строки введенной пользователем. 58 | * 59 | * @param input строка, введенная пользователем. 60 | * @return true - если пользователь ввел корректную комманду. 61 | */ 62 | private static boolean checkUserInput(String input) { 63 | String email_regex = "^(EXIT|LIST|ADD\\s[\\w-\\+]+(\\.[\\w]+)*@[\\w-]+(\\.[\\w]+)*(\\.[a-z]{2,}))$"; 64 | return input.matches(email_regex); 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /Stage6/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | SkillBox_Java 7 | ru.bechol 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | jar 12 | 13 | Stage6 14 | 15 | 16 | -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_61/DepositPaymentAccount.java: -------------------------------------------------------------------------------- 1 | package homework_61; 2 | 3 | import java.time.LocalDate; 4 | import java.time.Month; 5 | import java.time.Period; 6 | import java.util.Calendar; 7 | import java.util.Date; 8 | 9 | public class DepositPaymentAccount extends PaymentAccount { 10 | 11 | private LocalDate lastExpenceDate; 12 | 13 | public DepositPaymentAccount(double amount) { 14 | super(amount); 15 | lastExpenceDate = LocalDate.of(2019, Month.DECEMBER, 1); 16 | } 17 | 18 | public LocalDate getLastExpenceDate() { 19 | return lastExpenceDate; 20 | } 21 | 22 | @Override 23 | void startMessage() { 24 | System.out.println("Открыт депозитарный расчетный " + CURRENCY + " счет № " + getAccountId() + 25 | ". Баланс: " + getAmount() + CURRENCY); 26 | } 27 | 28 | @Override 29 | public void replenish(double sum) { 30 | super.replenish(sum); 31 | } 32 | 33 | @Override 34 | public void withdraw(double sum) { 35 | if (!(Period.between(lastExpenceDate, LocalDate.now()).getMonths() > 1)) { 36 | super.withdraw(sum); 37 | lastExpenceDate = LocalDate.now(); 38 | } else { 39 | System.out.println("Операция отменена. С момента последнего расхода средств прошло меньше месяца."); 40 | } 41 | } 42 | 43 | @Override 44 | public String toString() { 45 | return "Остаток на счете " + getAccountId() + 46 | " составляет " + getAmount() + CURRENCY; 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_61/GamePaymentAccount.java: -------------------------------------------------------------------------------- 1 | package homework_61; 2 | 3 | import java.time.LocalDate; 4 | import java.time.Month; 5 | import java.time.Period; 6 | 7 | public class GamePaymentAccount extends PaymentAccount { 8 | 9 | private LocalDate lastExpenceDate; 10 | 11 | public GamePaymentAccount(double amount) { 12 | super(amount); 13 | lastExpenceDate = LocalDate.of(2019, Month.NOVEMBER, 15); 14 | } 15 | 16 | public LocalDate getLastExpenceDate() { 17 | return lastExpenceDate; 18 | } 19 | 20 | @Override 21 | void startMessage() { 22 | System.out.println("Открыт игровой расчетный " + CURRENCY + " счет № " + getAccountId() + 23 | ". Баланс: " + getAmount() + CURRENCY); 24 | } 25 | 26 | @Override 27 | public void replenish(double sum) { 28 | super.replenish(sum); 29 | } 30 | 31 | @Override 32 | public void withdraw(double sum) { 33 | if (sum > 0 && getAmount() >= sum) { 34 | setAmount(getAmount() - sum - getAmount() * 0.01); 35 | System.out.println("Баланс счета № " + getAccountId() + " уменьшен на " + sum + CURRENCY + 36 | ". Остаток средств после операции: " + getAmount() + CURRENCY); 37 | } else { 38 | System.out.println("Неудалось уменьшить баланс на счете № " + 39 | getAccountId() + ". Недействительная сумма."); 40 | } 41 | 42 | } 43 | 44 | @Override 45 | public String toString() { 46 | return "Остаток на счете " + getAccountId() + 47 | " составляет " + getAmount() + CURRENCY; 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_61/Main.java: -------------------------------------------------------------------------------- 1 | package homework_61; 2 | 3 | public class Main { 4 | 5 | public static void main(String[] args) { 6 | PaymentAccount account = new PaymentAccount(160000.60); 7 | System.out.println(account); 8 | account.replenish(1534.54); 9 | account.withdraw(24000.45); 10 | DepositPaymentAccount dpa = new DepositPaymentAccount(150000.35); 11 | dpa.replenish(555.00); 12 | dpa.withdraw(14000); 13 | GamePaymentAccount gpa = new GamePaymentAccount(4100.00); 14 | gpa.replenish(800.12); 15 | gpa.withdraw(574.24); 16 | 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_61/PaymentAccount.java: -------------------------------------------------------------------------------- 1 | package homework_61; 2 | 3 | import java.util.Objects; 4 | 5 | public class PaymentAccount { 6 | 7 | private String accountId; 8 | private double amount; 9 | public final String CURRENCY = "RUR"; 10 | 11 | public PaymentAccount(double amount) { 12 | this.accountId = String.valueOf(System.nanoTime()); 13 | this.amount = amount; 14 | startMessage(); 15 | } 16 | 17 | void startMessage() { 18 | System.out.println("Открыт расчетный " + CURRENCY + " счет № " + accountId + ". Баланс: " + amount + CURRENCY); 19 | } 20 | 21 | public void setAmount(double amount) { 22 | this.amount = amount; 23 | } 24 | 25 | public String getAccountId() { 26 | return accountId; 27 | } 28 | 29 | public void setAccountId(String accountId) { 30 | this.accountId = accountId; 31 | } 32 | 33 | public double getAmount() { 34 | return amount; 35 | } 36 | 37 | /** 38 | * Метод void replenish(double sum). 39 | * Пополнение счета. 40 | * @param sum сумма для пополнения счета. 41 | */ 42 | public void replenish(double sum) { 43 | if (sum > 0) { 44 | this.amount += sum; 45 | System.out.println("Счет № " + accountId + " пополнен на " + sum + CURRENCY + 46 | ". Остаток средств после операции: " + amount + CURRENCY); 47 | } else { 48 | System.out.println("Неудалось пополнить счет № " + accountId + ". Недействительная сумма."); 49 | } 50 | } 51 | 52 | /** 53 | * Метод void withdraw(double sum). 54 | * Уменьшение баланса. 55 | * @param sum - сумма, которую переводим или снимаем. 56 | */ 57 | public void withdraw(double sum) { 58 | if (sum > 0 && amount >= sum) { 59 | this.amount -= sum; 60 | System.out.println("Баланс счета № " + accountId + " уменьшен на " + sum + CURRENCY + 61 | ". Остаток средств после операции: " + amount + CURRENCY); 62 | } else { 63 | System.out.println("Неудалось уменьшить баланс на счете № " + 64 | accountId + ". Недействительная сумма."); 65 | } 66 | } 67 | 68 | @Override 69 | public boolean equals(Object o) { 70 | if (this == o) return true; 71 | if (!(o instanceof PaymentAccount)) return false; 72 | PaymentAccount that = (PaymentAccount) o; 73 | return Double.compare(that.amount, amount) == 0 && 74 | accountId.equals(that.accountId); 75 | } 76 | 77 | @Override 78 | public int hashCode() { 79 | return Objects.hash(accountId, amount); 80 | } 81 | 82 | @Override 83 | public String toString() { 84 | return "Остаток на счете " + accountId + 85 | " составляет " + amount + CURRENCY; 86 | } 87 | } 88 | -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_61/package-info.java: -------------------------------------------------------------------------------- 1 | package homework_61; 2 | /* 3 | 6.1 4 | Создайте класс, который будет представлять собой расчётный счёт в банке. На этот расчётный счёт деньги 5 | можно положить, с него их можно снять, и ещё можно посмотреть, сколько денег на счёте. 6 | Создайте два класса-наследника - депозитарный расчётный счёт, с которого нельзя снимать деньги 7 | в течение месяца после последнего внесения, и карточный счёт, при снятии денег с которого будет взиматься комиссия 1%. 8 | */ -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_613/Main.java: -------------------------------------------------------------------------------- 1 | package homework_613; 2 | 3 | import homework_613.employees.Employee; 4 | import homework_613.employees.impl.Manager; 5 | import homework_613.employees.impl.Operator; 6 | import homework_613.employees.impl.TopManager; 7 | 8 | import java.text.NumberFormat; 9 | import java.util.ArrayList; 10 | import java.util.List; 11 | import java.util.Locale; 12 | 13 | /** 14 | * Домашняя работа 6.13 15 | * 16 | * @autor Oleg Bech 17 | * @email oleg071984@gmail.com 18 | * @see package-info.java 19 | */ 20 | public class Main { 21 | public static void main(String[] args) { 22 | Company bmw = new Company(2000000.00); 23 | //нанимаем 180 операторов 24 | List empList = new ArrayList<>(); 25 | for (int i = 0; i < 180; i++) 26 | empList.add(new Operator(bmw)); 27 | //нанимаем 80 менеджеров 28 | for (int i = 0; i < 80; i++) 29 | empList.add(new Manager(bmw)); 30 | //нанимаем 10 топменеджеров 31 | for (int i = 0; i < 10; i++) 32 | empList.add(new TopManager(bmw)); 33 | 34 | bmw.hireAll(empList); 35 | 36 | NumberFormat df = NumberFormat.getInstance(Locale.getDefault()); 37 | 38 | System.out.println("===Cписок состоящий из 13 самых высоких зарплат в компании==="); 39 | bmw.getTopSalaryStaff(13).forEach(i -> System.out.println(String.format("%,.2f руб.", i.getSalary()))); 40 | System.out.println("===Cписок состоящий из 13 самых низких зарплат в компании==="); 41 | bmw.getLowestSalaryStaff(13).forEach(i -> System.out.println(String.format("%,.2f руб.", i.getSalary()))); 42 | System.out.println("===Увольняем 50% сотрудников==="); 43 | System.out.println("Колчество сотрудников в компании до увольнения: " + bmw.getEmployees().size()); 44 | for (int i = 0; i < empList.size() / 2; i++) 45 | bmw.fire(empList.get(i)); 46 | System.out.println("Колчество сотрудников в компании после увольнения: " + bmw.getEmployees().size()); 47 | System.out.println("===Cписок состоящий из 13 самых высоких зарплат в компании==="); 48 | bmw.getTopSalaryStaff(13).forEach(i -> System.out.println(String.format("%,.2f руб.", i.getSalary()))); 49 | System.out.println("===Cписок состоящий из 30 самых низких зарплат в компании==="); 50 | bmw.getLowestSalaryStaff(30).forEach(i -> System.out.println(String.format("%,.2f руб.", i.getSalary()))); 51 | 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_613/employees/Employee.java: -------------------------------------------------------------------------------- 1 | package homework_613.employees; 2 | 3 | /** 4 | * Интерфейс Employee. 5 | * Содержит общие методы для классов сотрудников. 6 | * 7 | * @author Oleg Bech 8 | * @email oleg071984@gmail.com 9 | */ 10 | public interface Employee { 11 | 12 | /** 13 | * Метод double getRealWorkTime(). 14 | * Возвращает реальное количество часов, которое отработал сотрудник с учетом отгулов, больничных и т.п. 15 | * 16 | * @return реальное количество часов. 17 | */ 18 | default double getRealWorkTime() { 19 | return 160 * Math.random(); 20 | } 21 | 22 | /** 23 | * Метод getMonthSalary(). 24 | * Расчитывает зарплату сотрудников. 25 | * 26 | * @return зарплата сотрудника. 27 | */ 28 | Double getMonthSalary(); 29 | 30 | /** 31 | * Метод getSalary(). 32 | * Возвращает значение поля. 33 | * 34 | * @return зарплата сотрудника. 35 | */ 36 | Double getSalary(); 37 | } 38 | -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_613/employees/impl/Manager.java: -------------------------------------------------------------------------------- 1 | package homework_613.employees.impl; 2 | 3 | import homework_613.Company; 4 | import homework_613.employees.Employee; 5 | import homework_613.options.BonusConfig; 6 | import homework_613.options.PaymentRates; 7 | 8 | /** 9 | * Класс Manager. 10 | * Зарплата складывается из фиксированной части и бонуса в виде 5% от заработанных денег компании. 11 | * 12 | * @author Oleg Bech 13 | * @email oleg071984@gmail.com 14 | */ 15 | public class Manager implements Employee { 16 | 17 | private Company company; 18 | private Double salary; 19 | 20 | public Manager(Company company) { 21 | this.company = company; 22 | this.salary = getMonthSalary(); 23 | } 24 | 25 | @Override 26 | public Double getSalary() { 27 | return salary; 28 | } 29 | 30 | /** 31 | * Метод double getMonthSalary(). 32 | * Метод для расчета зарплаты менеджера. 33 | * 34 | * @return зарплата менеджера. 35 | */ 36 | @Override 37 | public Double getMonthSalary() { 38 | return PaymentRates.MANAGER.getRate() * getRealWorkTime() + 39 | company.getIncome() * BonusConfig.MANAGER.getBonusSize(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_613/employees/impl/Operator.java: -------------------------------------------------------------------------------- 1 | package homework_613.employees.impl; 2 | 3 | import homework_613.Company; 4 | import homework_613.employees.Employee; 5 | import homework_613.options.BonusConfig; 6 | import homework_613.options.PaymentRates; 7 | 8 | /** 9 | * Класс Operartor. 10 | * Зарплата складывается только из фиксированной части. 11 | * 12 | * @author Oleg Bech 13 | * @email oleg071984@gmail.com 14 | */ 15 | public class Operator implements Employee { 16 | 17 | private Company company; 18 | private Double salary; 19 | 20 | public Operator(Company company) { 21 | this.company = company; 22 | this.salary = getMonthSalary(); 23 | } 24 | 25 | @Override 26 | public Double getSalary() { 27 | return this.salary; 28 | } 29 | 30 | /** 31 | * Метод double getMonthSalary(). 32 | * Метод для расчета зарплаты оператора. 33 | * 34 | * @return зарплата оператора. 35 | */ 36 | @Override 37 | public Double getMonthSalary() { 38 | return PaymentRates.OPERATOR.getRate() * getRealWorkTime() + 39 | company.getIncome() * BonusConfig.OPERATOR.getBonusSize(); 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_613/employees/impl/TopManager.java: -------------------------------------------------------------------------------- 1 | package homework_613.employees.impl; 2 | 3 | import homework_613.Company; 4 | import homework_613.employees.Employee; 5 | import homework_613.options.BonusConfig; 6 | import homework_613.options.PaymentRates; 7 | 8 | /** 9 | * Класс TopManager. 10 | * зарплата складывается из фиксированной части и бонуса в виде 150% от заработной платы, 11 | * если доход компании более 10 млн рублей 12 | * 13 | * @author Oleg Bech 14 | * @email oleg071984@gmail.com 15 | */ 16 | public class TopManager implements Employee { 17 | 18 | private static final double INCOME_PART = 0.05; 19 | private Company company; 20 | private Double salary; 21 | 22 | public TopManager(Company company) { 23 | this.company = company; 24 | this.salary = getMonthSalary(); 25 | } 26 | 27 | @Override 28 | public Double getSalary() { 29 | return this.salary; 30 | } 31 | 32 | /** 33 | * Метод double getMonthSalary(). 34 | * Метод для расчета зарплаты топ-менеджера. 35 | * 36 | * @return зарплата топ-менеджера. 37 | */ 38 | @Override 39 | public Double getMonthSalary() { 40 | if (company.getIncome() > 10000000.00) 41 | return PaymentRates.TOP_MANAGER.getRate() * getRealWorkTime() + 42 | company.getIncome() * BonusConfig.TOP_MANAGER.getBonusSize(); 43 | return PaymentRates.TOP_MANAGER.getRate() * getRealWorkTime(); 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_613/options/BonusConfig.java: -------------------------------------------------------------------------------- 1 | package homework_613.options; 2 | 3 | /** 4 | * enum BonusConfig. 5 | * Настройка бонусов сотрудников. 6 | */ 7 | public enum BonusConfig { 8 | 9 | OPERATOR(0), 10 | MANAGER(0.5), 11 | TOP_MANAGER(1.5); 12 | 13 | private double bonusSize; 14 | 15 | BonusConfig(double bonusSize) { 16 | this.bonusSize = bonusSize; 17 | } 18 | 19 | public double getBonusSize() { 20 | return bonusSize; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_613/options/PaymentRates.java: -------------------------------------------------------------------------------- 1 | package homework_613.options; 2 | 3 | /** 4 | * enum PaymentRates. 5 | * Настройка тарифа оплаты за 1 час работы. 6 | */ 7 | public enum PaymentRates { 8 | 9 | OPERATOR(800.00), 10 | MANAGER(1000.00), 11 | TOP_MANAGER(2000.00); 12 | 13 | private double rate; 14 | 15 | PaymentRates(double rate) { 16 | this.rate = rate; 17 | } 18 | 19 | public double getRate() { 20 | return rate; 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_613/package-info.java: -------------------------------------------------------------------------------- 1 | package homework_613; 2 | 3 | /* 4 | Создайте классы: 5 | 6 | – Компания – Company, содержащую сотрудников и реализующая методы (тип возврата и аргументы на ваше усмотрение): 7 | 8 | Найм одного сотрудника – hire() 9 | Найм списка сотрудников – hireAll() 10 | Увольнение сотрудника – fire() 11 | Получение значения дохода компании – getIncome() 12 | 13 | 14 | Также реализовать два метода возвращающие список указанной длины (count) содержащие сотрудников отсортированных по убыванию и возрастанию заработной платы: 15 | 16 | List getTopSalaryStaff(int count) 17 | List getLowestSalaryStaff(int count) 18 | 19 | 20 | – Создать классы сотрудников, в которых будет информация о зарплатах, условия начисления зарплаты: 21 | 22 | Manager – зарплата складывается из фиксированной части и бонуса в виде 5% от заработанных денег для компании 23 | TopManager – зарплата складывается из фиксированной части и бонуса в виде 150% от заработной платы, если доход компании более 10 млн рублей 24 | Operator – зарплата складывается только из фиксированной части 25 | 26 | 27 | Каждый класс сотрудник должен имплементировать интерфейс Employee, в котором необходимо объявить метод возвращающий зарплату сотрудника: 28 | 29 | getMonthSalary() 30 | 31 | 32 | Для демонстрации и тестирования работы ваших классов выполните 33 | 34 | Создайте и наймите в компанию:180 операторов Operator, 80 менеджеров по продажам Manager, 10 топ менеджеров TopManager 35 | Распечатайте список состоящий из 10-15 самых высоких зарплат в компании 36 | Распечатайте список из 30 самых низких зарплат в компании 37 | Увольте 50% сотрудников 38 | Распечатайте список из 10-15 самых высоких зарплат в компании 39 | Распечатайте список из 30 самых низких зарплат в компании 40 | 41 | 42 | Примеры вывод списка зарплат: 43 | 44 | Список 5 зарплат по убыванию: 45 | 46 | 230 000 руб. 47 | 178 000 руб. 48 | 165 870 руб. 49 | 123 000 руб. 50 | 117 900 руб. 51 | 52 | 53 | Рекомендации к выполнению: 54 | 55 | учитывайте возможность создания разных экземпляров компании со своим списком сотрудников и доходом 56 | для получения данных компании внутри класса сотрудника реализуйте хранение ссылки на Company и передавайте с помощью конструктора или сеттера 57 | учтите что в методы получения список зарплат могут передаваться значения count превышающие количество сотрудников в компании. 58 | */ -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_66/Client.java: -------------------------------------------------------------------------------- 1 | package homework_66; 2 | 3 | abstract class Client { 4 | 5 | int bankAccount; 6 | 7 | public Client(int bankAccount) { 8 | this.bankAccount = bankAccount; 9 | } 10 | 11 | int getAmount() { 12 | return this.bankAccount; 13 | }; 14 | 15 | abstract void withdraw(int sum); 16 | 17 | abstract void replenish(int sum); 18 | } 19 | -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_66/Individual.java: -------------------------------------------------------------------------------- 1 | package homework_66; 2 | 3 | public class Individual extends Client { 4 | 5 | public Individual(int bankAccount) { 6 | super(bankAccount); 7 | System.out.println("Открыт счет для физического лица. Баланс счета: " + getAmount()); 8 | } 9 | 10 | @Override 11 | void withdraw(int sum) { 12 | if (sum > 0 && sum < getAmount()) { 13 | super.bankAccount -= sum; 14 | System.out.println("Расход по счету на " + sum + ". Остаток на счете: " + getAmount()); 15 | } else { 16 | System.out.println("Расход не возможен. Некорректная сумма."); 17 | } 18 | } 19 | 20 | @Override 21 | void replenish(int sum) { 22 | if (sum > 0) { 23 | super.bankAccount += sum; 24 | System.out.println("Пополнение счета на " + sum + ". Остаток на счете: " + getAmount()); 25 | } else { 26 | System.out.println("Пополнение счета невозможно. Некорректная сумма."); 27 | } 28 | } 29 | 30 | 31 | } 32 | -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_66/IndividualEntrepreneur.java: -------------------------------------------------------------------------------- 1 | package homework_66; 2 | 3 | /** 4 | * Юридическое лицо 5 | */ 6 | public class IndividualEntrepreneur extends Client { 7 | 8 | public IndividualEntrepreneur(int bankAccount) { 9 | super(bankAccount); 10 | System.out.println("Открыт счет для индифидуального предпринимателя. Баланс счета: " + getAmount()); 11 | } 12 | 13 | @Override 14 | void withdraw(int sum) { 15 | if (sum > 0 && sum < getAmount()) { 16 | super.bankAccount -= sum; 17 | System.out.println("Расход по счету на " + sum + ". Остаток на счете: " + getAmount()); 18 | } else { 19 | System.out.println("Расход не возможен. Некорректная сумма."); 20 | } 21 | 22 | } 23 | 24 | @Override 25 | void replenish(int sum) { 26 | if (sum > 0 && sum < 1000) { 27 | super.bankAccount += sum - sum * 0.01; 28 | System.out.println("Пополнение счета на " + sum + ". Остаток на счете: " + getAmount() + ". Комиссия 1%: " + 29 | sum * 0.01); 30 | } else if (sum>=1000) { 31 | super.bankAccount += sum - sum * 0.005; 32 | System.out.println("Пополнение счета на " + sum + ". Остаток на счете: " + getAmount() + ". Комиссия 0.5%: " + 33 | sum * 0.005); 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_66/LegalEntity.java: -------------------------------------------------------------------------------- 1 | package homework_66; 2 | 3 | /** 4 | * Юридическое лицо 5 | */ 6 | public class LegalEntity extends Client { 7 | 8 | public LegalEntity(int bankAccount) { 9 | super(bankAccount); 10 | System.out.println("Открыт счет для юридического лица. Баланс счета: " + getAmount()); 11 | } 12 | 13 | @Override 14 | void withdraw(int sum) { 15 | if (sum > 0 && sum <= super.bankAccount) { 16 | super.bankAccount -= sum - super.bankAccount * 0.01; 17 | System.out.println("Расход по счету на " + sum + ". Остаток на счете: " + getAmount()); 18 | } else { 19 | System.out.println("Расход не возможен. Некорректная сумма."); 20 | } 21 | } 22 | 23 | @Override 24 | void replenish(int sum) { 25 | if (sum > 0) { 26 | super.bankAccount += sum; 27 | System.out.println("Пополнение счета на " + sum + ". Остаток на счете: " + getAmount()); 28 | } else { 29 | System.out.println("Пополнение счета невозможно. Некорректная сумма."); 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_66/Main.java: -------------------------------------------------------------------------------- 1 | package homework_66; 2 | 3 | /** 4 | * 6.6 5 | * @see package-info.java 6 | * @author Oleg Bech 7 | * @email oleg071984@gmail.com 8 | */ 9 | public class Main { 10 | public static void main(String[] args) { 11 | Individual i = new Individual(5000); 12 | i.replenish(1500); 13 | i.withdraw(700); 14 | LegalEntity le = new LegalEntity(10000); 15 | le.replenish(7500); 16 | le.withdraw(1000); 17 | IndividualEntrepreneur ie = new IndividualEntrepreneur(15000); 18 | ie.replenish(800); 19 | ie.replenish(17000); 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /Stage6/src/main/java/homework_66/package-info.java: -------------------------------------------------------------------------------- 1 | package homework_66; 2 | /* 3 | 6.6 4 | Реализуйте классы, представляющие клиентов банка: абстрактный класс Client, а также классы для физических лиц, 5 | юридических лиц и индивидуальных предпринимателей. У каждого клиента есть расчётный счёт (число), 6 | который можно пополнять, с которого можно снимать, и баланс на котором можно смотреть. 7 | Реализовать методы таким образом, чтобы у физических лиц пополнение и снятие происходило без комиссии, 8 | у юридических лиц — снятие с комиссией 1%, а у ИП — пополнение с комиссией 1%, если сумма меньше 1000 рублей, 9 | и 0,5%, если сумма больше либо равна 1000 рублей. 10 | */ -------------------------------------------------------------------------------- /Stage8/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | SkillBox_Java 7 | ru.bechol 8 | 1.0-SNAPSHOT 9 | 10 | 4.0.0 11 | jar 12 | 13 | Stage8 14 | 15 | 16 | -------------------------------------------------------------------------------- /Stage8/src/main/java/ConsoleCustomerList/Customer.java: -------------------------------------------------------------------------------- 1 | package ConsoleCustomerList; 2 | 3 | /** 4 | * Класс Customer. 5 | * Реализация покупателя. 6 | * @author SkillBox. 7 | */ 8 | public class Customer 9 | { 10 | private String name; //имя 11 | private String phone; //телефон 12 | private String eMail; //адрес почтового ящика 13 | 14 | public Customer(String name, String phone, String eMail) 15 | { 16 | this.name = name; 17 | this.phone = phone; 18 | this.eMail = eMail; 19 | } 20 | 21 | public String toString() 22 | { 23 | return name + " - " + eMail + " - " + phone; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /Stage8/src/main/java/ConsoleCustomerList/CustomerStorage.java: -------------------------------------------------------------------------------- 1 | package ConsoleCustomerList; 2 | 3 | import ConsoleCustomerList.exceptions.EmptyDataException; 4 | import ConsoleCustomerList.exceptions.EmptyListException; 5 | import ConsoleCustomerList.exceptions.NotFindCustomerException; 6 | 7 | import java.util.HashMap; 8 | 9 | /** 10 | * Класс CustomerStorage. 11 | * Реализация хранилища для покупателей. 12 | * 13 | * @author SkillBox. 14 | * @student Oleg Bech 15 | * @email oleg071984@gmail.com 16 | */ 17 | public class CustomerStorage { 18 | private HashMap storage; //коллекция покупателей. 19 | 20 | public CustomerStorage() { 21 | storage = new HashMap<>(); 22 | } 23 | 24 | /** 25 | * Метод void addCustomer(String data). 26 | * Добавление покупателя в коллекцю storage. 27 | * 28 | * @param data - входные данные. 29 | * @see ConsoleCustomerList.exceptions.EmptyDataException 30 | */ 31 | public void addCustomer(String data) { 32 | if (data != null && !data.isEmpty()) { 33 | try { 34 | String[] components = data.split("\\s+"); 35 | String name = components[0] + " " + components[1]; 36 | storage.put(name, new Customer(name, components[3], components[2])); 37 | } catch (ArrayIndexOutOfBoundsException ex) { 38 | System.out.println("Входные данные неполные или не соответствуют формату команды. \n" + 39 | "Для справки введите команду help"); 40 | } 41 | } else { 42 | throw new EmptyDataException(); 43 | } 44 | } 45 | 46 | /** 47 | * Метод void listCustomers(). 48 | * Вывод в консоль списка покупателей. 49 | * При пустой коллекции выбрасывает EmptyListException. 50 | * 51 | * @see ConsoleCustomerList.exceptions.EmptyListException 52 | */ 53 | public void listCustomers() { 54 | if (storage.values().size() != 0) { 55 | storage.values().forEach(System.out::println); 56 | } else { 57 | throw new EmptyListException(); 58 | } 59 | } 60 | 61 | /** 62 | * Метод void removeCustomer(String name). 63 | * Удаляет покупателя. 64 | * 65 | * @param name - имя покупателя. 66 | * @see ConsoleCustomerList.exceptions.NotFindCustomerException 67 | * @see ConsoleCustomerList.exceptions.EmptyDataException 68 | */ 69 | public void removeCustomer(String name) { 70 | if (name != null && !name.isEmpty()) { 71 | Customer tmpCustomer = new Customer(name, null, null); 72 | if (storage.containsValue(tmpCustomer)) { 73 | storage.remove(name); 74 | tmpCustomer = null; 75 | } else { 76 | tmpCustomer = null; 77 | throw new NotFindCustomerException(); 78 | } 79 | } else { 80 | throw new EmptyDataException(); 81 | } 82 | } 83 | 84 | /** 85 | * Метод int getCount(). 86 | * Возвращает общее количество покупателей в коллекции. 87 | * 88 | * @return общее количество покупателей в коллекции. 89 | */ 90 | public int getCount() { 91 | return storage.size(); 92 | } 93 | } -------------------------------------------------------------------------------- /Stage8/src/main/java/ConsoleCustomerList/Main.java: -------------------------------------------------------------------------------- 1 | package ConsoleCustomerList; 2 | 3 | import ConsoleCustomerList.exceptions.EmptyDataException; 4 | import ConsoleCustomerList.exceptions.EmptyListException; 5 | import ConsoleCustomerList.exceptions.NotFindCustomerException; 6 | 7 | import java.util.Scanner; 8 | 9 | public class Main { 10 | private static String addCommand = "add Василий Петров " + 11 | "vasily.petrov@gmail.com +79215637722"; 12 | private static String commandExamples = "\t" + addCommand + "\n" + 13 | "\tlist\n\tcount\n\tremove Василий Петров"; 14 | private static String commandError = "Wrong command! Available command examples: \n" + 15 | commandExamples; 16 | private static String helpText = "Command examples:\n" + commandExamples; 17 | 18 | public static void main(String[] args) { 19 | Scanner scanner = new Scanner(System.in); 20 | CustomerStorage executor = new CustomerStorage(); 21 | for (; ; ) { 22 | try { 23 | String command = scanner.nextLine(); 24 | String[] tokens = command.split("\\s+", 2); 25 | if (tokens[0].equals("add")) { 26 | executor.addCustomer(tokens[1]); 27 | } else if (tokens[0].equals("list")) { 28 | executor.listCustomers(); 29 | } else if (tokens[0].equals("remove")) { 30 | executor.removeCustomer(tokens[1]); 31 | } else if (tokens[0].equals("count")) { 32 | System.out.println("There are " + executor.getCount() + " customers"); 33 | } else if (tokens[0].equals("help")) { 34 | System.out.println(helpText); 35 | } else { 36 | System.out.println(commandError); 37 | } 38 | } catch (EmptyListException ele) { 39 | System.out.println(ele.getMessage()); 40 | } catch (ArrayIndexOutOfBoundsException ex) { 41 | System.out.println("Входные данные отсутвуют."); 42 | } catch (NotFindCustomerException nfe) { 43 | System.out.println(nfe.getMessage()); 44 | } catch (EmptyDataException ede) { 45 | System.out.println(ede.getMessage()); 46 | } 47 | } 48 | } 49 | } 50 | -------------------------------------------------------------------------------- /Stage8/src/main/java/ConsoleCustomerList/exceptions/EmptyDataException.java: -------------------------------------------------------------------------------- 1 | package ConsoleCustomerList.exceptions; 2 | 3 | public class EmptyDataException extends RuntimeException { 4 | @Override 5 | public String getMessage() { 6 | return "Пустые входные данные. Невозможно выполнить команду."; 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /Stage8/src/main/java/ConsoleCustomerList/exceptions/EmptyListException.java: -------------------------------------------------------------------------------- 1 | package ConsoleCustomerList.exceptions; 2 | 3 | /** 4 | * Класс EmptyListException. 5 | * Исключение. 6 | * @author Oleg Bech 7 | * @email oleg071984@gmail.com 8 | */ 9 | public class EmptyListException extends RuntimeException { 10 | 11 | @Override 12 | public String getMessage() { 13 | return "В базе данных отсутствуют записи."; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /Stage8/src/main/java/ConsoleCustomerList/exceptions/NotFindCustomerException.java: -------------------------------------------------------------------------------- 1 | package ConsoleCustomerList.exceptions; 2 | 3 | public class NotFindCustomerException extends RuntimeException { 4 | @Override 5 | public String getMessage() { 6 | return "Покупатель не найден в коллекции или введенное имя не соответствует формату команды. \n" + 7 | "Введите команду help для получения справки"; 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Stage9/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | SkillBox_Java 7 | ru.bechol 8 | 1.0-SNAPSHOT 9 | 10 | 11 | 11 12 | 11 13 | 14 | jar 15 | 4.0.0 16 | Stage9 17 | 18 | 19 | 20 | org.apache.commons 21 | commons-csv 22 | 1.7 23 | 24 | 25 | 26 | commons-io 27 | commons-io 28 | 2.7 29 | 30 | 31 | 32 | org.jsoup 33 | jsoup 34 | 1.15.3 35 | 36 | 37 | 38 | com.fasterxml.jackson.core 39 | jackson-core 40 | 2.10.1 41 | 42 | 43 | 44 | com.fasterxml.jackson.core 45 | jackson-annotations 46 | 2.10.1 47 | 48 | 49 | 50 | com.fasterxml.jackson.core 51 | jackson-databind 52 | 2.12.7.1 53 | 54 | 55 | 56 | -------------------------------------------------------------------------------- /Stage9/src/main/java/BankStatement/Main.java: -------------------------------------------------------------------------------- 1 | package BankStatement; 2 | 3 | import BankStatement.pojo.BankAccount; 4 | import BankStatement.pojo.Operation; 5 | import org.apache.commons.csv.CSVFormat; 6 | import org.apache.commons.csv.CSVRecord; 7 | 8 | import java.io.BufferedReader; 9 | import java.io.File; 10 | import java.io.FileReader; 11 | import java.io.IOException; 12 | import java.time.LocalDate; 13 | import java.time.format.DateTimeFormatter; 14 | import java.util.ArrayList; 15 | import java.util.List; 16 | import java.util.TreeSet; 17 | import java.util.stream.Collectors; 18 | import static BankStatement.Utility.*; 19 | 20 | /** 21 | * Класс Main. 22 | * Домашняя работа 9.9. 23 | * @see package-info.java 24 | * @see Utility class 25 | * @author Oleg Bech 26 | * @email oleg071984@gmail.com 27 | */ 28 | public class Main { 29 | 30 | private static final String DATA_PATCH = "Stage9/Data/movementList.csv"; 31 | private static final DateTimeFormatter CSV_DATE_FORMATTER = DateTimeFormatter.ofPattern("dd.MM.yy"); 32 | 33 | public static void main(String[] args) throws IOException { 34 | 35 | List opList = new ArrayList<>(); 36 | BufferedReader br = new BufferedReader(new FileReader(new File(DATA_PATCH)), 1000); 37 | Iterable csvRecords = CSVFormat.DEFAULT.withFirstRecordAsHeader().parse(br); 38 | 39 | for (CSVRecord record : csvRecords) { 40 | opList.add(new Operation( 41 | new BankAccount(record.get("Номер счета"), record.get("Тип счёта"), record.get("Валюта")), 42 | LocalDate.parse(record.get("Дата операции"), CSV_DATE_FORMATTER), 43 | record.get("Референс проводки"), 44 | record.get("Описание операции"), 45 | getShortDescription(record.get("Описание операции")), 46 | getDouble(record.get("Приход")), 47 | getDouble(record.get("Расход")) 48 | ) 49 | ); 50 | } 51 | 52 | br.close(); 53 | 54 | TreeSet oper_types = opList.stream().map(Operation::getShortDescription). 55 | collect(Collectors.toCollection(TreeSet::new)); 56 | 57 | System.out.println("\nГруппировка по приходу: "); 58 | oper_types.forEach(operation -> System.out.println(operation + ": " + opList.stream() 59 | .filter(o -> o.getShortDescription().equals(operation) && o.getIncome() > 0) 60 | .mapToDouble(Operation::getIncome).sum())); 61 | System.out.println("\nГруппировка по расходу: "); 62 | oper_types.forEach(operation -> System.out.println(operation + ": " + opList.stream() 63 | .filter(o -> o.getShortDescription().equals(operation) && o.getFlow() > 0) 64 | .mapToDouble(Operation::getFlow).sum())); 65 | 66 | System.out.println("\nОбщий приход: " + opList.stream().mapToDouble(Operation::getIncome).sum()); 67 | System.out.println("\nОбщий расход: " + opList.stream().mapToDouble(Operation::getFlow).sum()); 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /Stage9/src/main/java/BankStatement/Utility.java: -------------------------------------------------------------------------------- 1 | package BankStatement; 2 | 3 | import lombok.extern.log4j.Log4j2; 4 | 5 | /** 6 | * Утилитный класс Utility. 7 | * Служит для подержки преобразования банковской выписки. 8 | * 9 | * @author Oleg Bech 10 | * @email oleg071984@gmail.com 11 | */ 12 | @Log4j2 13 | public class Utility { 14 | 15 | private Utility() { 16 | } 17 | 18 | /** 19 | * Метод double getDouble(String sum). 20 | * Конвертация строки в double. 21 | * 22 | * @param sum строка. 23 | * @return значение типа double. 24 | */ 25 | public static double getDouble(String sum) { 26 | try { 27 | return Double.parseDouble(sum); 28 | } catch (NumberFormatException nfe) { 29 | log.warn(sum + " --> Исправлен некорректный тип данных."); 30 | return Double.parseDouble(sum 31 | .replaceAll("\"", "") 32 | .replaceAll(",", ".")); 33 | } catch (NullPointerException npe) { 34 | log.error("!> Не указана сумма для преобразования."); 35 | return 0.0; 36 | } 37 | } 38 | 39 | /** 40 | * Метод String getShortDescription(String fullDescription). 41 | * Возвращает краткое описание для статистики. 42 | * 43 | * @param fullDescription полное описание операции из файла данных. 44 | * @return краткое описание. 45 | */ 46 | public static String getShortDescription(String fullDescription) { 47 | try { 48 | String[] tmpArr = fullDescription.split("\\s{3,}"); 49 | return tmpArr[1].lastIndexOf("\\") >= 0 ? 50 | tmpArr[1].substring(tmpArr[1].lastIndexOf("\\") + 1).trim().toUpperCase() : 51 | tmpArr[1].substring(tmpArr[1].lastIndexOf("/") + 1).trim().toUpperCase(); 52 | } catch (NullPointerException npe) { 53 | log.error("!> Полное описание не найдено."); 54 | return "нет краткого описания"; 55 | } 56 | } 57 | } -------------------------------------------------------------------------------- /Stage9/src/main/java/BankStatement/package-info.java: -------------------------------------------------------------------------------- 1 | package BankStatement; 2 | /** 3 | Домашняя работа 9.9 4 | Написать код парсинга банковской выписки (файл movementsList.csv). 5 | Код должен выводить сводную информацию по этой выписке: общий приход, общий расход, а также разбивку расходов. 6 | */ -------------------------------------------------------------------------------- /Stage9/src/main/java/BankStatement/pojo/BankAccount.java: -------------------------------------------------------------------------------- 1 | package BankStatement.pojo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | /** 7 | * Класс BankAccount. 8 | * Реализация банковского счета. 9 | * @author Oleg Bech 10 | * @email oleg071984@gmail.com 11 | */ 12 | @Data 13 | @AllArgsConstructor 14 | public class BankAccount { 15 | private String id; //номер 16 | private String type; //тип 17 | private String currency; //валюта 18 | } 19 | -------------------------------------------------------------------------------- /Stage9/src/main/java/BankStatement/pojo/Operation.java: -------------------------------------------------------------------------------- 1 | package BankStatement.pojo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | import java.time.LocalDate; 7 | 8 | /** 9 | * Класс Operation. 10 | * Реализация банковской операции. 11 | * @author Oleg Bech. 12 | * @email oleg071984@gmail.com 13 | */ 14 | @Data 15 | @AllArgsConstructor 16 | public class Operation { 17 | 18 | private BankAccount bankAccount; //банковский счет 19 | private LocalDate operationDate; //дата операции 20 | private String bankingReference; //референс проводки 21 | private String description; //описание оперции 22 | private String shortDescription; //краткое описание 23 | private double income; //приход 24 | private double flow; //расход 25 | 26 | } 27 | -------------------------------------------------------------------------------- /Stage9/src/main/java/FolderCopy/Main.java: -------------------------------------------------------------------------------- 1 | package FolderCopy; 2 | 3 | import org.apache.commons.io.FileUtils; 4 | 5 | import java.io.File; 6 | import java.io.IOException; 7 | import java.util.Arrays; 8 | 9 | 10 | 11 | /** 12 | * Домашняя работа 9.7 13 | * Написать код, который будет копировать указанную папку с файлами с сохранением структуры в другую указанную папку. 14 | * 15 | * @author Oleg Bech 16 | * @email oleg071984@gmail.com 17 | */ 18 | public class Main { 19 | 20 | private static final File SRC_DIR = new File("Stage9/src/main/java/FolderCopy/primer/src_dir"); 21 | private static final File DEST_DIR = new File("Stage9/src/main/java/FolderCopy/primer/dst_dir"); 22 | 23 | public static void main(String[] args) throws IOException { 24 | try{ 25 | long start = System.nanoTime(); 26 | FileUtils.copyDirectory(SRC_DIR, DEST_DIR); 27 | long end = System.nanoTime(); 28 | System.out.println((end-start)/1000000 + " мс"); 29 | } catch (Exception e) { 30 | e.printStackTrace(); 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /Stage9/src/main/java/FolderCopy/primer/src_dir/1.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Stage9/src/main/java/FolderCopy/primer/src_dir/2.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Stage9/src/main/java/FolderCopy/primer/src_dir/tmp/3.xml: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Stage9/src/main/java/FolderSize/Main.java: -------------------------------------------------------------------------------- 1 | package FolderSize; 2 | 3 | import org.apache.logging.log4j.LogManager; 4 | import org.apache.logging.log4j.Logger; 5 | 6 | import java.io.File; 7 | import java.io.FileNotFoundException; 8 | import java.io.IOException; 9 | import java.nio.file.Files; 10 | import java.nio.file.Path; 11 | import java.text.DecimalFormat; 12 | import java.util.Scanner; 13 | 14 | /** 15 | * Домашняя работа 9.5 16 | * 17 | * @autor Oleg Bech 18 | * @email oleg071984@gmail.com 19 | * @see package-info.java 20 | */ 21 | public class Main { 22 | 23 | private static final Logger LOG = LogManager.getRootLogger(); 24 | 25 | public static void main(String[] args) throws IOException { 26 | while (true) { 27 | try { 28 | System.out.println("Введите путь к папке:"); 29 | String path = new Scanner(System.in).nextLine(); 30 | if (path != null && !path.isEmpty()) { 31 | File folder = new File(path); 32 | if (!folder.exists()) 33 | throw new FileNotFoundException(); 34 | print(getFolderSize(folder)); 35 | } 36 | } catch (NullPointerException npe) { 37 | LOG.warn("В указанной папке нет файлов."); 38 | } catch (FileNotFoundException sfe) { 39 | LOG.error("Директория не существует. Указан ошибочный путь."); 40 | } 41 | } 42 | } 43 | 44 | /** 45 | * Метод long getFolderSize(File folder). 46 | * Считает размер папки по содержимому. 47 | * 48 | * @param dir объект File, содержащий путь к интересующей папке. 49 | * @return размер указанной папки. 50 | */ 51 | private static long getFolderSize(File dir) throws IOException { 52 | Path path = Path.of(dir.toURI()); 53 | return Files.walk(path).mapToLong(p -> p.toFile().length() ).sum(); 54 | } 55 | 56 | /** 57 | * Метод void print(long size). 58 | * Вывод в удобочитаемом формате размера указанной папки в принятых единицах измерения. 59 | * 60 | * @param size размер папки в байтах. 61 | */ 62 | private static void print(long size) { 63 | String[] units = new String[]{"B", "KB", "MB", "GB", "TB"}; 64 | int unitIndex = (int) (Math.log10(size) / 3); 65 | double unitValue = 1 << (unitIndex * 10); 66 | String readableSize = new DecimalFormat("#,##0.##") 67 | .format(size / unitValue) + " " 68 | + units[unitIndex]; 69 | System.out.println(readableSize); 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /Stage9/src/main/java/FolderSize/package-info.java: -------------------------------------------------------------------------------- 1 | package FolderSize; 2 | /* 3 | Домашняя работа 9.5 4 | Написать программу, которая будет измерять размер всего содержимого папки, 5 | путь которой передаётся на вход, и выводить его в удобочитаемом виде — в байтах, килобайтах, мегабайтах или гигабайтах. 6 | */ -------------------------------------------------------------------------------- /Stage9/src/main/java/JsonParser/package-info.java: -------------------------------------------------------------------------------- 1 | package JsonParser; 2 | /* 3 | Домашняя работа 9.14 4 | 9.14.1 Написать код парсинга страницы Википедии “Список станций Московского метрополитена”, 5 | который будет на основе этой страницы создавать JSON-файл со списком станций по линиям 6 | и списком линий по формату JSON-файла из проекта SPBMetro (файл map.json, приложен к домашнему заданию) 7 | 8 | 9.14.2* Также пропарсить и вывести в JSON-файл переходы между станциями. 9 | 10 | 9.14.3 Написать код, который прочитает созданный JSON-файл и напечатает количества станций на каждой линии. 11 | */ -------------------------------------------------------------------------------- /Stage9/src/main/java/JsonParser/pojo/Line.java: -------------------------------------------------------------------------------- 1 | package JsonParser.pojo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | @Data 7 | @AllArgsConstructor 8 | public class Line { 9 | 10 | private String number; 11 | private String name; 12 | private String color; 13 | private int stationsAmount; 14 | } 15 | -------------------------------------------------------------------------------- /Stage9/src/main/java/JsonParser/pojo/Passage.java: -------------------------------------------------------------------------------- 1 | package JsonParser.pojo; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Data; 5 | 6 | @Data 7 | @AllArgsConstructor 8 | public class Passage { 9 | private String line; 10 | private String station; 11 | } 12 | -------------------------------------------------------------------------------- /Stage9/src/main/java/LentaImageDownloader/Main.java: -------------------------------------------------------------------------------- 1 | package LentaImageDownloader; 2 | 3 | import lombok.extern.log4j.Log4j2; 4 | import org.apache.commons.io.FileUtils; 5 | import org.jsoup.Jsoup; 6 | import org.jsoup.nodes.Document; 7 | import org.jsoup.select.Elements; 8 | 9 | import java.io.File; 10 | import java.io.IOException; 11 | import java.net.URL; 12 | 13 | /** 14 | * Домашняя работа 9.12 15 | * 16 | * @author Oleg Bech 17 | * @email oleg071984@gmail.com 18 | * @see package-info.java 19 | */ 20 | @Log4j2 21 | public class Main { 22 | 23 | /** 24 | * Адрес сайта для парсинга картинок. 25 | */ 26 | private static final String WEB_URL = "https://www.lenta.ru"; 27 | 28 | public static void main(String[] args) throws IOException { 29 | Document doc = Jsoup.connect(WEB_URL).get(); 30 | log.info("Connect to " + doc.title()); 31 | Elements imagesURLs = doc.select("img[src~=(?i)\\.(png|jpe?g|gif)]"); 32 | imagesURLs.forEach(i -> { 33 | try { 34 | FileUtils.copyURLToFile(new URL(i.attr("src")), 35 | new File("Stage9/src/main/java/LentaImageDownloader/lenta.ru/" + 36 | i.attr("src") 37 | .substring(i.attr("src").lastIndexOf("/")))); 38 | log.info(i.attr("src") + " --> " + "ok"); 39 | } catch (IOException e) { 40 | log.error(e.getMessage()); 41 | } 42 | }); 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /Stage9/src/main/java/LentaImageDownloader/package-info.java: -------------------------------------------------------------------------------- 1 | package LentaImageDownloader; 2 | /* 3 | Домашнее задание 9.12 4 | Написать код, который будет получать список абсолютных путей изображений 5 | с главной страницы сайта lenta.ru и скачивать эти изображения в заданную папку. 6 | */ -------------------------------------------------------------------------------- /Stage9/src/main/resources/log4j2.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | ru.bechol 8 | SkillBox_Java 9 | pom 10 | 1.0-SNAPSHOT 11 | 12 | 11 13 | 11 14 | UTF-8 15 | 16 | 17 | Stage4 18 | Stage5 19 | Stage6 20 | Stage8 21 | Stage9 22 | Stage10 23 | Stage11 24 | Stage12 25 | Stage13 26 | Stage14 27 | Stage15 28 | Stage16 29 | Stage18 30 | Stage19 31 | 32 | 33 | 34 | 35 | 36 | org.apache.commons 37 | commons-io 38 | 1.3.2 39 | 40 | 41 | 42 | org.apache.logging.log4j 43 | log4j-api 44 | 2.16.0 45 | 46 | 47 | 48 | org.apache.logging.log4j 49 | log4j-core 50 | 2.17.1 51 | 52 | 53 | 54 | org.projectlombok 55 | lombok 56 | 1.18.8 57 | provided 58 | 59 | 60 | 61 | --------------------------------------------------------------------------------
18 | Username 19 | 21 |
23 | Password 24 | 26 |
28 | Registration 29 |