Skip to content

Commit 981a075

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

31 files changed

Lines changed: 1339 additions & 0 deletions

‎.github/workflows/ci.yml‎

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
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+
28+
- name: Build
29+
run: mvn -B clean compile -Dmaven.test.skip=true -Djava.awt.headless=true
30+
31+
- name: Run tests with coverage
32+
run: mvn -B test -Djava.awt.headless=true
33+
34+
- name: Verify coverage
35+
run: mvn -B verify -Dmaven.test.skip=true -Djava.awt.headless=true
36+
37+
- name: Coverage summary
38+
if: always()
39+
run: |
40+
if [ -f target/site/jacoco/jacoco.csv ]; then
41+
echo "## Test Coverage Report" >> $GITHUB_STEP_SUMMARY
42+
echo '```' >> $GITHUB_STEP_SUMMARY
43+
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
44+
echo '```' >> $GITHUB_STEP_SUMMARY
45+
echo "" >> $GITHUB_STEP_SUMMARY
46+
echo "### Per-class" >> $GITHUB_STEP_SUMMARY
47+
echo '| Class | Coverage | Lines |' >> $GITHUB_STEP_SUMMARY
48+
echo '|-------|----------|-------|' >> $GITHUB_STEP_SUMMARY
49+
awk -F',' 'NR>1 {total=$4+$5; if(total>0) pct=$5*100/total; else pct=100; printf "| %s.%s | %.0f%% | %d/%d |\n", $2, $3, pct, $5, total}' target/site/jacoco/jacoco.csv >> $GITHUB_STEP_SUMMARY
50+
fi
51+
52+
- name: Upload coverage
53+
if: always()
54+
uses: codecov/codecov-action@v4
55+
with:
56+
file: target/site/jacoco/jacoco.xml
57+
fail_ci_if_error: false
58+
env:
59+
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: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
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>org.junit.jupiter</groupId>
22+
<artifactId>junit-jupiter</artifactId>
23+
<version>5.11.4</version>
24+
<scope>test</scope>
25+
</dependency>
26+
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
27+
<dependency>
28+
<groupId>com.google.code.gson</groupId>
29+
<artifactId>gson</artifactId>
30+
<version>2.13.2</version>
31+
</dependency>
32+
</dependencies>
33+
34+
<build>
35+
<plugins>
36+
<plugin>
37+
<groupId>org.apache.maven.plugins</groupId>
38+
<artifactId>maven-compiler-plugin</artifactId>
39+
<version>3.13.0</version>
40+
<configuration>
41+
<source>${java.version}</source>
42+
<target>${java.version}</target>
43+
</configuration>
44+
</plugin>
45+
46+
<!-- JaCoCo code coverage -->
47+
<plugin>
48+
<groupId>org.jacoco</groupId>
49+
<artifactId>jacoco-maven-plugin</artifactId>
50+
<version>0.8.12</version>
51+
<executions>
52+
<execution>
53+
<id>prepare-agent</id>
54+
<goals><goal>prepare-agent</goal></goals>
55+
</execution>
56+
<execution>
57+
<id>report</id>
58+
<phase>test</phase>
59+
<goals><goal>report</goal></goals>
60+
</execution>
61+
<execution>
62+
<id>check</id>
63+
<phase>verify</phase>
64+
<goals><goal>check</goal></goals>
65+
<configuration>
66+
<rules>
67+
<rule>
68+
<element>BUNDLE</element>
69+
<limits>
70+
<limit>
71+
<counter>LINE</counter>
72+
<value>COVEREDRATIO</value>
73+
<minimum>1.00</minimum>
74+
</limit>
75+
</limits>
76+
</rule>
77+
</rules>
78+
</configuration>
79+
</execution>
80+
</executions>
81+
</plugin>
82+
83+
<plugin>
84+
<groupId>org.apache.maven.plugins</groupId>
85+
<artifactId>maven-surefire-plugin</artifactId>
86+
<version>3.5.2</version>
87+
</plugin>
88+
</plugins>
89+
</build>
90+
</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+
}

0 commit comments

Comments
 (0)