Skip to content

Commit 4b9c15c

Browse files
committed
Занятие 1 для курса Java 2 LevelUp
0 parents  commit 4b9c15c

31 files changed

Lines changed: 1288 additions & 0 deletions

‎.github/workflows/ci.yml‎

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
name: CI
2+
3+
on:
4+
push:
5+
branches: [ master, main ]
6+
pull_request:
7+
branches: [ master, main ]
8+
workflow_dispatch:
9+
10+
concurrency:
11+
group: ${{ github.workflow }}-${{ github.ref }}
12+
cancel-in-progress: true
13+
14+
jobs:
15+
build:
16+
runs-on: ubuntu-latest
17+
timeout-minutes: 15
18+
19+
steps:
20+
- uses: actions/checkout@v4
21+
22+
- name: Set up JDK 17
23+
uses: actions/setup-java@v4
24+
with:
25+
java-version: '17'
26+
distribution: 'temurin'
27+
cache: 'maven'
28+
29+
- name: Build with Maven
30+
run: mvn -B clean compile -Dmaven.test.skip=true -Djava.awt.headless=true
31+
32+
- name: Run tests with coverage
33+
run: mvn -B test jacoco:report -Djava.awt.headless=true || true
34+
35+
- name: Show coverage summary
36+
run: |
37+
if [ -f target/site/jacoco/jacoco.csv ]; then
38+
echo "## Test Coverage Report" >> $GITHUB_STEP_SUMMARY
39+
echo '```' >> $GITHUB_STEP_SUMMARY
40+
awk -F',' 'NR>1 {missed+=$4; covered+=$5} END {total=missed+covered; if(total>0) printf "Line Coverage: %d/%d (%.1f%%)\nMissed: %d lines\n", covered, total, covered*100/total, missed; else print "No coverage data"}' target/site/jacoco/jacoco.csv >> $GITHUB_STEP_SUMMARY
41+
echo '```' >> $GITHUB_STEP_SUMMARY
42+
else
43+
echo "No JaCoCo coverage report found" >> $GITHUB_STEP_SUMMARY
44+
fi
45+
46+
- name: Upload coverage to Codecov
47+
uses: codecov/codecov-action@v4
48+
with:
49+
file: target/site/jacoco/jacoco.xml
50+
fail_ci_if_error: false
51+
env:
52+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}

‎.gitignore‎

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Maven
2+
target/
3+
pom.xml.tag
4+
pom.xml.releaseBackup
5+
pom.xml.versionsBackup
6+
pom.xml.next
7+
release.properties
8+
dependency-reduced-pom.xml
9+
buildNumber.properties
10+
.mvn/timing.properties
11+
12+
# Idea project
13+
.idea
14+
*.iml
15+
16+
# Data files
17+
*.dat
18+
*.xml
19+
*.txt

‎.travis.yml‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
language: java
2+
jdk:
3+
- oraclejdk8

‎CLAUDE.md‎

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# Java2FirstLesson — Занятие 1 для курса Java 2 LevelUp
2+
3+
## Learning Objectives
4+
5+
This is educational material. Key goals:
6+
- Study the source code and understand the patterns used
7+
- Complete exercises and homework assignments
8+
- Experiment with modifications to deepen understanding
9+
10+
## Prerequisites
11+
12+
- JDK 8+
13+
- Maven 3.x
14+
15+
## Build & Run
16+
17+
```bash
18+
mvn clean install
19+
mvn test
20+
```
21+
22+
## Development Guidelines
23+
24+
### Code Style
25+
- Follow standard Java conventions
26+
- Keep code clean and well-organized
27+
- Use meaningful variable and method names
28+
29+
### Git Workflow
30+
- Write clear, descriptive commit messages
31+
- One logical change per commit
32+
- Test before committing
33+
34+
### Testing
35+
- Write tests for new functionality
36+
- Run the full test suite before pushing
37+
- Keep tests focused and independent

‎README.md‎

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
Java 2: Занятие 1
2+
=================
3+
4+
Maven
5+
-----
6+
* Сборка проекта с помощью Maven
7+
* Конфигурационный файл Maven
8+
* Управление записимостями
9+
* Подключение зависимостей на примере JUnit и Gson
10+
11+
JUnit тесты
12+
-----------
13+
* Тесты, аннотация: ```@Test```
14+
* ```@Before``` и ```@After```
15+
* ```@BeforeClass``` и ```@AfterClass```
16+
* Проверка исключений ```@Test(expected = ExceptionClassName.class)```
17+
18+
Способы и виды сериализации
19+
---------------------------
20+
* Сериализация: сохраняем класс как данные и
21+
потом можем его однозначно восстановить.
22+
* Для чего?
23+
1. Мы хотим обработать объект в другой программе
24+
2. Сохранение и загрузка объекта
25+
* Сериализация объектов: в бинарный формат, в XML, JSON и т.д.
26+
* Интерфейс ```java.io.Serializable```
27+
* Объектные потоки ввода-вывода
28+
* Условия успешной упаковки и распаковки объектов
29+
* Сериализация в структурные форматы на примере Json
30+
31+
Сериализация = сохранение, Десериализация = загрузка
32+
33+
Подробнее: https://docs.oracle.com/javase/8/docs/technotes/guides/serialization/
34+
35+
Google JSON: https://github.com/google/gson
36+
37+
Помечаем класс аннотацией ```Serializable```
38+
--------------------------------------------
39+
```java
40+
public class Task implements Serializable {
41+
public String name;
42+
public int priority;
43+
}
44+
```
45+
Сохраняем в бинарном формате:
46+
-----------------------------
47+
```java
48+
try (ObjectOutputStream s =
49+
new ObjectOutputStream(
50+
new FileOutputStream(fileName))) {
51+
s.writeObject(task);
52+
}
53+
```
54+
Загружаем в бинарном формате:
55+
-----------------------------
56+
```java
57+
try (ObjectInputStream s =
58+
new ObjectInputStream(
59+
new FileInputStream(fileName))) {
60+
task = (Task) s.readObject();
61+
}
62+
```
63+
64+
* [XML-формат](src/test/java/serialization/B_XMLSerializationTest.java)
65+
* [JSON-формат](src/test/java/serialization/C_JSONSerializationTest.java)

‎pom.xml‎

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3+
xmlns="http://maven.apache.org/POM/4.0.0"
4+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
5+
http://maven.apache.org/xsd/maven-4.0.0.xsd">
6+
<modelVersion>4.0.0</modelVersion>
7+
8+
<groupId>java</groupId>
9+
<artifactId>Java2FirstLesson</artifactId>
10+
<version>1.0-SNAPSHOT</version>
11+
12+
<properties>
13+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
14+
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
15+
<java.version>1.8</java.version>
16+
<myProperty>myValue</myProperty>
17+
</properties>
18+
19+
<dependencies>
20+
<dependency>
21+
<groupId>junit</groupId>
22+
<artifactId>junit</artifactId>
23+
<version>RELEASE</version>
24+
</dependency>
25+
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
26+
<dependency>
27+
<groupId>com.google.code.gson</groupId>
28+
<artifactId>gson</artifactId>
29+
<version>2.13.2</version>
30+
</dependency>
31+
</dependencies>
32+
33+
<build>
34+
<plugins>
35+
<plugin>
36+
<groupId>org.apache.maven.plugins</groupId>
37+
<artifactId>maven-compiler-plugin</artifactId>
38+
<version>3.3</version>
39+
<configuration>
40+
<source>${java.version}</source>
41+
<target>${java.version}</target>
42+
</configuration>
43+
</plugin>
44+
</plugins>
45+
</build>
46+
</project>

‎src/main/java/HW.java‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
public class HW {
2+
public static void main(String... args) {
3+
System.out.println("Hello world!");
4+
}
5+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package contacts;
2+
3+
import java.io.Serializable;
4+
import java.util.ArrayList;
5+
import java.util.Arrays;
6+
import java.util.List;
7+
8+
public class Contact implements Serializable {
9+
private String name; // Фамилия Имя Отчество
10+
private List<String> phones; // Список телефонов
11+
12+
public Contact(String name, String... phones) {
13+
this(name, Arrays.asList(phones));
14+
}
15+
16+
public Contact(String name, List<String> phones) {
17+
this.name = name;
18+
this.phones = new ArrayList<>(phones);
19+
}
20+
21+
public String getName() {
22+
return name;
23+
}
24+
25+
public List<String> getPhones() {
26+
return new ArrayList<>(phones);
27+
}
28+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package contacts;
2+
3+
import java.io.IOException;
4+
import java.util.List;
5+
6+
public interface ContactBook {
7+
/**
8+
* Сохранение списка контактов в файл
9+
*
10+
* @param fileName Имя файла для сохранения
11+
*/
12+
void save(String fileName) throws IOException;
13+
14+
/**
15+
* Загрузка контактов из файла
16+
* Список контактов из файла добавляется в список
17+
*
18+
* @param fileName Имя файла для загрузки контактов
19+
*/
20+
void load(String fileName) throws IOException, ClassNotFoundException;
21+
22+
/**
23+
* Поиск всех контаков начинающихся на заданную строку start
24+
* Используется для автодополнения
25+
*
26+
* @param start Начало имени или телефона
27+
* @return Список подходящих контактов
28+
*/
29+
List<Contact> search(String start);
30+
31+
/**
32+
* Добавить новый контакт
33+
*
34+
* @param contact добавляемый контакт
35+
*/
36+
void add(Contact contact);
37+
38+
/**
39+
* @return количество контактов
40+
*/
41+
int size();
42+
}
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package contacts;
2+
3+
import java.io.*;
4+
import java.util.ArrayList;
5+
import java.util.List;
6+
7+
public class ContactBookImpl implements ContactBook {
8+
List<Contact> contacts = new ArrayList<>();
9+
10+
/**
11+
* Сохранение списка контактов в файл
12+
*
13+
* @param fileName Имя файла для сохранения
14+
*/
15+
@Override
16+
public void save(String fileName) throws IOException {
17+
try (ObjectOutputStream out =
18+
new ObjectOutputStream(
19+
new BufferedOutputStream(
20+
new FileOutputStream(fileName)
21+
))) {
22+
out.writeObject(contacts);
23+
}
24+
}
25+
26+
/**
27+
* Загрузка контактов из файла
28+
*
29+
* @param fileName Имя файла для загрузки контактов
30+
*/
31+
@Override
32+
public void load(String fileName) throws IOException, ClassNotFoundException {
33+
try (ObjectInputStream in =
34+
new ObjectInputStream(
35+
new BufferedInputStream(
36+
new FileInputStream(fileName)
37+
))) {
38+
List<Contact> list = (List<Contact>) in.readObject();
39+
contacts.addAll(list);
40+
}
41+
}
42+
43+
/**
44+
* Поиск всех контаков начинающихся на заданную строку start
45+
* Используется для автодополнения
46+
*
47+
* @param start Начало имени или телефона
48+
* @return Список подходящих контактов
49+
*/
50+
@Override
51+
public List<Contact> search(String start) {
52+
List<Contact> found = new ArrayList<>();
53+
for (Contact contact : contacts) {
54+
if (contact.getName().startsWith(start))
55+
found.add(contact);
56+
else {
57+
for (String phone : contact.getPhones()) {
58+
if (phone.startsWith(start)) {
59+
found.add(contact);
60+
break;
61+
}
62+
}
63+
}
64+
}
65+
return found;
66+
}
67+
68+
/**
69+
* Добавить новый контакт
70+
*
71+
* @param contact добавляемый контакт
72+
*/
73+
@Override
74+
public void add(Contact contact) {
75+
contacts.add(contact);
76+
}
77+
78+
/**
79+
* @return количество контактов
80+
*/
81+
@Override
82+
public int size() {
83+
return contacts.size();
84+
}
85+
}

0 commit comments

Comments
 (0)