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