diff --git a/module05/pom.xml b/module05/pom.xml
index e64564f4..524fb82c 100644
--- a/module05/pom.xml
+++ b/module05/pom.xml
@@ -8,12 +8,50 @@
4.0.0
module05
- jar
-
- module05
-
UTF-8
+
+ 16
+ 16
+ 5.9.2
+ 5.5.0
+ 5.3.1
+ 3.24.2
+
+
+ org.junit.jupiter
+ junit-jupiter-engine
+ ${junit.version}
+ test
+
+
+ org.mockito
+ mockito-core
+ ${mockito.version}
+ test
+
+
+
+ org.mockito
+ mockito-junit-jupiter
+ ${mockito.junit.version}
+ test
+
+
+ org.assertj
+ assertj-core
+ ${assertj.version}
+
+
+ junit
+ junit
+ RELEASE
+ test
+
+
+
+
+
diff --git a/module05/src/main/java/ru/sberbank/edu/App.java b/module05/src/main/java/ru/sberbank/edu/App.java
index 5419c026..4ed5920c 100644
--- a/module05/src/main/java/ru/sberbank/edu/App.java
+++ b/module05/src/main/java/ru/sberbank/edu/App.java
@@ -4,10 +4,22 @@
* Hello world!
*
*/
-public class App
-{
- public static void main( String[] args )
- {
- System.out.println( "Hello World!" );
+public class App {
+ public static void main(String[] args) {
+ System.out.println("Hello World!");
+
+
+ CityInfo moscow = new CityInfo("Moscow", new GeoPosition("55(45'4.4784'')", "37(37'6.3228'')"));
+ //53° 12′ 10″ N, 50° 8′ 27″ E
+ CityInfo samara = new CityInfo("Samara", new GeoPosition("53(12' 10'')", "50(8'27'')"));
+
+ TravelService ts = new TravelService();
+
+ ts.add(moscow);
+ ts.add(samara);
+
+ System.out.println(ts.getDistance("Moscow","Samara"));
+ System.out.println(ts.getCitiesNear("Moscow",1000000).get(1).getName());
+
}
}
diff --git a/module05/src/main/java/ru/sberbank/edu/CityInfo.java b/module05/src/main/java/ru/sberbank/edu/CityInfo.java
index f37134e2..a8004247 100644
--- a/module05/src/main/java/ru/sberbank/edu/CityInfo.java
+++ b/module05/src/main/java/ru/sberbank/edu/CityInfo.java
@@ -8,6 +8,14 @@ public class CityInfo {
private String name;
private GeoPosition position;
+ public String getName() {
+ return name;
+ }
+
+ public GeoPosition getPosition() {
+ return position;
+ }
+
/**
* Ctor.
*
diff --git a/module05/src/main/java/ru/sberbank/edu/GeoPosition.java b/module05/src/main/java/ru/sberbank/edu/GeoPosition.java
index 2dc4e21b..575c96e9 100644
--- a/module05/src/main/java/ru/sberbank/edu/GeoPosition.java
+++ b/module05/src/main/java/ru/sberbank/edu/GeoPosition.java
@@ -15,6 +15,14 @@ public class GeoPosition {
*/
private double longitude;
+ public double getLatitude() {
+ return latitude;
+ }
+
+ public double getLongitude() {
+ return longitude;
+ }
+
/**
* Ctor.
*
@@ -24,6 +32,51 @@ public class GeoPosition {
*/
public GeoPosition(String latitudeGradus, String longitudeGradus) {
// parse and set latitude and longitude in radian
+
+ int degres = 0;
+ int minutes = 0;
+ double seconds = 0;
+
+ String[] splitLatitude = latitudeGradus.split("\\(|\\'{1,2}\\)*");
+ String[] splitLongitude = longitudeGradus.split("\\(|\\'{1,2}\\)*");
+/**
+ Считаем широту
+ */
+ for(int i =0; i <= splitLongitude.length; i++){
+ switch (i) {
+ case (0):
+ degres = Integer.parseInt(splitLongitude[i]);
+ break;
+ case (1):
+ minutes = Integer.parseInt(splitLongitude[i]);
+ break;
+ case (2):
+ seconds = Double.parseDouble(splitLongitude[i]);
+ break;
+ default:
+ break;
+ }
+ }
+ longitude = ( degres + (minutes + seconds /60)/60) * Math.PI/180;
+ /**
+ Считаем долготу
+ */
+ for(int i =0; i <= splitLatitude.length; i++){
+ switch (i) {
+ case (0):
+ degres = Integer.parseInt(splitLatitude[i]);
+ break;
+ case (1):
+ minutes = Integer.parseInt(splitLatitude[i]);
+ break;
+ case (2):
+ seconds = Double.parseDouble(splitLongitude[i]);
+ break;
+ default:
+ break;
+ }
+ }
+ latitude = ( degres + (minutes + seconds /60)/60) * Math.PI/180;
}
// getters and toString
diff --git a/module05/src/main/java/ru/sberbank/edu/TravelService.java b/module05/src/main/java/ru/sberbank/edu/TravelService.java
index 830d188c..756dd749 100644
--- a/module05/src/main/java/ru/sberbank/edu/TravelService.java
+++ b/module05/src/main/java/ru/sberbank/edu/TravelService.java
@@ -8,9 +8,12 @@
*/
public class TravelService {
+ final double RADIUS = 6372795;
+
// do not change type
private final List cities = new ArrayList<>();
+
/**
* Append city info.
*
@@ -19,6 +22,7 @@ public class TravelService {
*/
public void add(CityInfo cityInfo) {
// do something
+ cities.add(cityInfo);
}
/**
@@ -29,13 +33,14 @@ public void add(CityInfo cityInfo) {
*/
public void remove(String cityName) {
// do something
+ cities.removeIf(f -> cityName.equalsIgnoreCase(f.getName()));
}
/**
* Get cities names.
*/
public List citiesNames() {
- return null;
+ return cities.stream().map(CityInfo::getName).toList();
}
/**
@@ -46,8 +51,37 @@ public List citiesNames() {
* @param destCityName - destination city
* @throws IllegalArgumentException if source or destination city doesn't exist.
*/
+
+ /**
+ *
+ * Много долгих скучных вычислений
+ *
+ */
public int getDistance(String srcCityName, String destCityName) {
- return 0;
+ /**
+ * подготовка данных для расчёта
+ */
+ double srcLongitude = cities.stream().filter(f -> f.getName().equals(srcCityName)).toList().get(0).getPosition().getLongitude();
+ double srcLatitude = cities.stream().filter(f -> f.getName().equals(srcCityName)).toList().get(0).getPosition().getLatitude();
+
+ double destLongitude = cities.stream().filter(f -> f.getName().equals(destCityName)).toList().get(0).getPosition().getLongitude();
+ double destLatitude = cities.stream().filter(f -> f.getName().equals(destCityName)).toList().get(0).getPosition().getLatitude();
+
+ double cosLatitudeSrc = Math.cos(srcLatitude);
+ double cosLatitudeDest = Math.cos(destLatitude);
+ double sinLatitudeSrc = Math.sin(srcLatitude);
+ double sinLatitudeDest = Math.sin(destLatitude);
+ double delta = destLongitude - srcLongitude;
+ double cosDelta = Math.cos(delta);
+ double sinDelta = Math.sin(delta);
+
+ double y = Math.sqrt(Math.pow(cosLatitudeDest * sinDelta, 2) + Math.pow(cosLatitudeSrc * sinLatitudeDest - sinLatitudeSrc * cosLatitudeDest * cosDelta, 2));
+ double x = sinLatitudeSrc * sinLatitudeDest + cosLatitudeSrc * cosLatitudeDest * cosDelta;
+
+ double dist = Math.atan2(y, x) * RADIUS;
+
+ return (int)dist;
+
}
/**
@@ -57,7 +91,8 @@ public int getDistance(String srcCityName, String destCityName) {
* @param radius - radius in kilometers for search
* @throws IllegalArgumentException if city with cityName city doesn't exist.
*/
- public List getCitiesNear(String cityName, int radius) {
- return null;
+ public List getCitiesNear(String cityName, int radius) {
+ return cities.stream().filter(f -> ((this.getDistance(cityName, f.getName()) <= radius))).toList();
}
+
}
diff --git a/module05/src/test/java/ru/sberbank/edu/AppTest.java b/module05/src/test/java/ru/sberbank/edu/AppTest.java
index 895d735c..a1593ecf 100644
--- a/module05/src/test/java/ru/sberbank/edu/AppTest.java
+++ b/module05/src/test/java/ru/sberbank/edu/AppTest.java
@@ -1,38 +1,31 @@
package ru.sberbank.edu;
-import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
+import org.assertj.core.api.Assertions;
+import org.junit.jupiter.api.Test;
/**
* Unit test for simple App.
*/
-public class AppTest
- extends TestCase
-{
- /**
- * Create the test case
- *
- * @param testName name of the test case
- */
- public AppTest( String testName )
- {
- super( testName );
- }
+public class AppTest
+ extends TestCase {
- /**
- * @return the suite of tests being tested
- */
- public static Test suite()
- {
- return new TestSuite( AppTest.class );
- }
+ @Test
+ void main(){
+ CityInfo moscow = new CityInfo("Moscow", new GeoPosition("55(45'4.4784'')", "37(37'6.3228'')"));
+ //53° 12′ 10″ N, 50° 8′ 27″ E
+ CityInfo samara = new CityInfo("Samara", new GeoPosition("53(12' 10'')", "50(8'27'')"));
+
+ TravelService ts = new TravelService();
+
+ ts.add(moscow);
+ ts.add(samara);
- /**
- * Rigourous Test :-)
- */
- public void testApp()
- {
- assertTrue( true );
+ Assertions.assertThat(ts.getDistance("Moscow","Samara")).isEqualTo(855832);
+
+ Assertions.assertThat(ts.getCitiesNear("Moscow",1000000).get(1).getName()).isEqualTo("Samara");
}
}
+
+
diff --git a/module06/pom.xml b/module06/pom.xml
index 04ee5cb5..325cc880 100644
--- a/module06/pom.xml
+++ b/module06/pom.xml
@@ -22,5 +22,17 @@
h2
2.1.214
+
+ org.testng
+ testng
+ RELEASE
+ test
+
+
+ junit
+ junit
+ 3.8.2
+ test
+
diff --git a/module06/src/main/java/ru/sberbank/edu/CarBootstrap.java b/module06/src/main/java/ru/sberbank/edu/CarBootstrap.java
index 3798585d..e3348e98 100644
--- a/module06/src/main/java/ru/sberbank/edu/CarBootstrap.java
+++ b/module06/src/main/java/ru/sberbank/edu/CarBootstrap.java
@@ -21,6 +21,9 @@ public static void main(String[] args) throws Exception {
CarService carService = new CarServiceImpl(carRepository);
carService.addCar("777", "Lada");
+ carService.addCar("7", "Gazel");
+ carService.addCar("77", "VAZ");
+ carService.addCar("7777", "UAZ");
// Test check start
String readAllCarsSql = "SELECT * FROM car";
@@ -33,6 +36,28 @@ public static void main(String[] args) throws Exception {
System.out.println("id=" + id + "; model=" + model);
}
// Test end
+ carService.deleteCar("77");
+
+ readAllCarsSql = "SELECT * FROM car";
+ statement = H2DbEmbedded.getConnection().createStatement();
+ resultSet = statement.executeQuery(readAllCarsSql);
+
+ while (resultSet.next()) {
+ String id = resultSet.getString(1);
+ String model = resultSet.getString(2);
+ System.out.println("id=" + id + "; model=" + model);
+ }
+
+ System.out.println(carService.findAll());
+
+ System.out.println(carService.findByModel("UAZ"));
+
+ System.out.println(carService.findAll());
+
+ System.out.println(carService.deleteAll());
+
+ System.out.println(carService.findAll());
+
}
server.stop();
}
diff --git a/module06/src/main/java/ru/sberbank/edu/repository/CarDbRepositoryImpl.java b/module06/src/main/java/ru/sberbank/edu/repository/CarDbRepositoryImpl.java
index 0a7a2d25..764cdbf4 100644
--- a/module06/src/main/java/ru/sberbank/edu/repository/CarDbRepositoryImpl.java
+++ b/module06/src/main/java/ru/sberbank/edu/repository/CarDbRepositoryImpl.java
@@ -7,7 +7,10 @@
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
+import java.util.Collection;
+import java.util.HashSet;
import java.util.Optional;
+import java.util.Set;
public class CarDbRepositoryImpl implements CarRepository {
private final Connection connection;
@@ -41,6 +44,32 @@ public Car createOrUpdate(Car car) throws SQLException {
return car;
}
+ @Override
+ public Set createAll(Collection cars) throws SQLException {
+ cars.forEach(car -> {
+ try {
+ createOrUpdate(car);
+ } catch (SQLException e) {
+ throw new RuntimeException(e);
+ }
+ });
+
+ return findAll();
+
+ }
+
+ @Override
+ public Set findAll() throws SQLException {
+ Set carSet = new HashSet<>();
+ PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM car");
+ ResultSet resultSet = preparedStatement.executeQuery();
+ while (resultSet.next()) {
+ Car car = new Car(resultSet.getString(1), resultSet.getString(2));
+ carSet.add( car );
+ }
+ return carSet;
+ }
+
@Override
public Optional findById(String id) throws SQLException {
// validation
@@ -60,8 +89,19 @@ public Optional findById(String id) throws SQLException {
}
@Override
- public Boolean deleteById(String id) {
- return null;
+ public Boolean deleteById(String id) throws SQLException {
+ PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM car where id = ?");
+ preparedStatement.setString(1, id);
+ return preparedStatement.execute();
+ }
+
+ @Override
+ public Boolean deleteAll() throws SQLException {
+ PreparedStatement preparedStatement = connection.prepareStatement("DELETE FROM car");
+ preparedStatement.execute();
+ if(findAll().isEmpty()) {
+ return true;
+ }else return false;
}
private int countRowsById(String id) throws SQLException {
@@ -74,4 +114,16 @@ private int countRowsById(String id) throws SQLException {
}
return rowCount;
}
+
+ @Override
+ public Set findByModel(String model) throws SQLException {
+ Set carSet = new HashSet<>();
+ PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM car where model = " + " '" + model + "'");
+ ResultSet resultSet = preparedStatement.executeQuery();
+ while (resultSet.next()) {
+ Car car = new Car(resultSet.getString(1), resultSet.getString(2));
+ carSet.add( car );
+ }
+ return carSet;
+ }
}
diff --git a/module06/src/main/java/ru/sberbank/edu/repository/CarRepository.java b/module06/src/main/java/ru/sberbank/edu/repository/CarRepository.java
index 7fcad2be..9877c0a5 100644
--- a/module06/src/main/java/ru/sberbank/edu/repository/CarRepository.java
+++ b/module06/src/main/java/ru/sberbank/edu/repository/CarRepository.java
@@ -2,8 +2,9 @@
import ru.sberbank.edu.model.Car;
+import java.sql.SQLException;
import java.util.Set;
public interface CarRepository extends Repository {
- Set findByModel(String model);
+ Set findByModel(String model) throws SQLException;
}
diff --git a/module06/src/main/java/ru/sberbank/edu/repository/Repository.java b/module06/src/main/java/ru/sberbank/edu/repository/Repository.java
index 0875f22e..9baeb72b 100644
--- a/module06/src/main/java/ru/sberbank/edu/repository/Repository.java
+++ b/module06/src/main/java/ru/sberbank/edu/repository/Repository.java
@@ -8,11 +8,11 @@
public interface Repository{
T createOrUpdate(T t) throws SQLException;
- Set createAll(Collection tCollection);
- Set findAll();
+ Set createAll(Collection tCollection) throws SQLException;
+ Set findAll() throws SQLException;
Optional findById(I id) throws SQLException;
- Boolean deleteById(I id);
+ Boolean deleteById(I id) throws SQLException;
- Boolean deleteAll();
+ Boolean deleteAll() throws SQLException;
}
diff --git a/module06/src/main/java/ru/sberbank/edu/service/CarService.java b/module06/src/main/java/ru/sberbank/edu/service/CarService.java
index 3e7b274a..c6805714 100644
--- a/module06/src/main/java/ru/sberbank/edu/service/CarService.java
+++ b/module06/src/main/java/ru/sberbank/edu/service/CarService.java
@@ -1,6 +1,10 @@
package ru.sberbank.edu.service;
+import ru.sberbank.edu.model.Car;
+
import java.sql.SQLException;
+import java.util.Collection;
+import java.util.Set;
public interface CarService {
@@ -10,4 +14,14 @@ public interface CarService {
void deleteCar(String id);
+ /**
+ *Реализуем переопределённые методы сервиса
+ */
+ Set createAll(Collection cars) throws SQLException;
+ Set findAll() throws SQLException;
+ Boolean deleteAll() throws SQLException;
+ Set findByModel(String model) throws SQLException;
+
+
+
}
diff --git a/module06/src/main/java/ru/sberbank/edu/service/CarServiceImpl.java b/module06/src/main/java/ru/sberbank/edu/service/CarServiceImpl.java
index e5eb91b4..f38a4152 100644
--- a/module06/src/main/java/ru/sberbank/edu/service/CarServiceImpl.java
+++ b/module06/src/main/java/ru/sberbank/edu/service/CarServiceImpl.java
@@ -5,11 +5,33 @@
import ru.sberbank.edu.repository.CarRepository;
import java.sql.SQLException;
+import java.util.Collection;
import java.util.Optional;
+import java.util.Set;
public class CarServiceImpl implements CarService {
private CarRepository carRepository;
+ @Override
+ public Set createAll(Collection cars) throws SQLException {
+ return carRepository.createAll(cars);
+ }
+
+ @Override
+ public Set findAll() throws SQLException {
+ return carRepository.findAll();
+ }
+
+ @Override
+ public Boolean deleteAll() throws SQLException {
+ return carRepository.deleteAll();
+ }
+
+ @Override
+ public Set findByModel(String model) throws SQLException {
+ return carRepository.findByModel(model);
+ }
+
public CarServiceImpl(CarRepository carRepository) {
this.carRepository = carRepository;
}
@@ -26,6 +48,15 @@ public void editModel(String id, String newModel) throws SQLException {
updateCarModel(car, newModel);
}
+ @Override
+ public void deleteCar(String id) {
+ try {
+ carRepository.deleteById(id);
+ } catch (SQLException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
private void updateCarModel(Car car, String newModel) {
car.setModel(newModel);
try {
diff --git a/module06/src/test/java/ru/sberbank/edu/CarBootstrapTest.java b/module06/src/test/java/ru/sberbank/edu/CarBootstrapTest.java
new file mode 100644
index 00000000..189c08e6
--- /dev/null
+++ b/module06/src/test/java/ru/sberbank/edu/CarBootstrapTest.java
@@ -0,0 +1,59 @@
+package ru.sberbank.edu;
+
+import org.assertj.core.api.Assertions;
+import org.h2.tools.Server;
+import org.junit.jupiter.api.Test;
+import ru.sberbank.edu.dbconnection.H2DbEmbedded;
+import ru.sberbank.edu.repository.CarDbRepositoryImpl;
+import ru.sberbank.edu.repository.CarRepository;
+import ru.sberbank.edu.service.CarService;
+import ru.sberbank.edu.service.CarServiceImpl;
+
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+class CarBootstrapTest {
+
+ @Test
+ void main() throws SQLException {
+ String args;
+ Server server = Server.createTcpServer().start();
+ H2DbEmbedded.initDb();
+
+ try(H2DbEmbedded h2DbEmbedded = new H2DbEmbedded()) {
+ CarRepository carRepository = new CarDbRepositoryImpl(H2DbEmbedded.getConnection());
+ CarService carService = new CarServiceImpl(carRepository);
+
+ carService.addCar("777", "Lada");
+ carService.addCar("7", "Gazel");
+ carService.addCar("77", "VAZ");
+ carService.addCar("7777", "UAZ");
+
+ // Test check start
+ String readAllCarsSql = "SELECT * FROM car";
+ Statement statement = H2DbEmbedded.getConnection().createStatement();
+ ResultSet resultSet = statement.executeQuery(readAllCarsSql);
+
+ // Test end
+ carService.deleteCar("77");
+
+ readAllCarsSql = "SELECT * FROM car";
+ statement = H2DbEmbedded.getConnection().createStatement();
+ resultSet = statement.executeQuery(readAllCarsSql);
+
+
+ Assertions.assertThat(carService.findAll().toString()).isEqualTo("[Car{id='777', model='Lada'}, Car{id='7', model='Gazel'}, Car{id='7777', model='UAZ'}]");
+
+ Assertions.assertThat(carService.findByModel("UAZ").toString()).isEqualTo("[Car{id='7777', model='UAZ'}]");
+
+ Assertions.assertThat(carService.deleteAll()).isEqualTo(true);
+
+ Assertions.assertThat(carService.findAll().isEmpty()).isEqualTo(true);
+
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ server.stop();
+ }
+}
\ No newline at end of file