Compare commits
No commits in common. "PROJEKT-1" and "PROJEKT-2" have entirely different histories.
60
README.md
60
README.md
@ -1,26 +1,40 @@
|
||||
# PRA2024
|
||||
Pracownia Programowania - przyrost1
|
||||
Pracownia Programowania - Projekt 2
|
||||
Autor: Marcin Hutek s485949
|
||||
|
||||
Wykorzystana baza danych zostala przygotowana przy uzyciu PostgreSQL i zawiera cztery tabele: 'films',
|
||||
'films_info', 'category' oraz 'language'. Baza zostala wstepnie spopulowana tysiacem rekordow.
|
||||
|
||||
Backup bazy z jej kodem zrodlowym PRA2024.sql wygenerowany przy pomocy
|
||||
komendy pg_dump umieszczony został w folderze database w drzewku projektu.
|
||||
|
||||
## ZMAPOWANE ENCJE ##
|
||||
#### FilmModel ####
|
||||
- zmapowana podstawowa encja 'films' z bazy danych zawierajaca kolumny: 'film_id', 'film_title'
|
||||
- w relacji OneToOne z encją FilmInfoModel
|
||||
#### FilmInfoModel ####
|
||||
- zmapowana encja 'films_info' bazy danych zawierajaca kolumny: 'film_id', 'description', 'release_year',
|
||||
'language_id', 'length', 'rating', 'category_id' oraz pole ZonedDateTime - 'last_update'
|
||||
- w relacji OneToOne z encją FilmModel
|
||||
- w relacji ManyToOne z encją FilmCategoryModel
|
||||
- w relacji ManyToOne z encją FilmLanguageModel
|
||||
#### FilmCategoryModel ####
|
||||
- zmapowana encja 'category' bazy danych zawierajaca kolumny: 'category_id', 'name'
|
||||
- w relacji OneToMany z encją FilmInfoModel
|
||||
#### FilmLanguageModel ####
|
||||
- zmapowana encja 'language' bazy danych zawierajaca kolumny: 'language_id', 'language'
|
||||
- w relacji OneToMany z encją FilmInfoModel
|
||||
|
||||
## SESJA ORAZ ZAPYTANIA ##
|
||||
#### Main ####
|
||||
- główna pętla programu
|
||||
#### CityNames ####
|
||||
- odczytanie i wyswietlenie w konsoli nazw dostepnych miast z przygotowanego wczesniej pliku .json.
|
||||
- wykorzystatnie strumienia
|
||||
#### JsonToMap ####
|
||||
- polaczenie listy dostepnych miast i ich koordynatow na podstawie przygotowanego pliku .json
|
||||
- wykorzystanie mapy
|
||||
#### HttpClient ####
|
||||
- utworzenie klienta Http i wykonanie GET request'a
|
||||
#### WeatherForecast ####
|
||||
- zdefiniowanie obiektu skupiajacego pobrane dane dotyczace pogody dla danego miasta
|
||||
- metoda wyswietlajaca w konsoli lancuch tekstowy zawierajacy dane o pogodzie dla wskazanego
|
||||
przez uzytkownika miasta
|
||||
- metody zapisu do poszczegolnych formatow - do json i xml wykorzystana zostala lista wyzej wspomnianych obiektow,
|
||||
do pdf wykorzystany zostal utworzony w tym celu plik textowy temporary_file
|
||||
#### ForecastPreparation ####
|
||||
- odczytanie z odpowiedzi API odpowiednich danych na temat prognoz
|
||||
- utworzenie obiektu weatherForecast skupiajacego te dane
|
||||
#### TemporaryFile ####
|
||||
- utworzenie pustego pliku txt w ktorym przechowywana jest lista pobrany prognoz w danej sesji
|
||||
#### TESTY ####
|
||||
- zgodnie z wymaganiami projektu przygotowano 3 testy mockujace dla klasy HttpClient
|
||||
- zdefiniowanie sesji oraz wywolanie poszczegolnych zapytan
|
||||
#### Queries ####
|
||||
- dwa query z parametrem: getFilmByLangYear oraz getFilmByLangCategory
|
||||
- query stronicowane: getAllFilmsByPage
|
||||
- metoda sluzaca do tworzenia nowych rekordow w bazie: createFilmModel
|
||||
|
||||
## TESTY ##
|
||||
#### QueriesTest ####
|
||||
- dla kazdego zapytania przygotowane zostaly po dwa przykladowe testy mockujace
|
||||
- dla metody sluzacej do dodawania rekordow do bazy przygotowany zostal jeden przykladowy test
|
||||
mockujacy sesje i sprawdzajacy czy rekord zostal poprawnie utworzony
|
27
cities.json
27
cities.json
@ -1,27 +0,0 @@
|
||||
[
|
||||
{
|
||||
"name": "warsaw",
|
||||
"latitude": 52.24,
|
||||
"longitude": 21.02
|
||||
},
|
||||
{
|
||||
"name": "berlin",
|
||||
"latitude": 52.52,
|
||||
"longitude": 13.40
|
||||
},
|
||||
{
|
||||
"name": "chicago",
|
||||
"latitude": 41.88,
|
||||
"longitude": -87.62
|
||||
},
|
||||
{
|
||||
"name": "vancouver",
|
||||
"latitude": 49.25,
|
||||
"longitude": -123.12
|
||||
},
|
||||
{
|
||||
"name": "tokyo",
|
||||
"latitude": 35.65,
|
||||
"longitude": 139.84
|
||||
}
|
||||
]
|
2319
database/PRA2024.sql
Normal file
2319
database/PRA2024.sql
Normal file
File diff suppressed because it is too large
Load Diff
47
pom.xml
47
pom.xml
@ -5,7 +5,7 @@
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>org.example</groupId>
|
||||
<artifactId>testy</artifactId>
|
||||
<artifactId>PRA2024</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
|
||||
<properties>
|
||||
@ -13,37 +13,22 @@
|
||||
<maven.compiler.target>18</maven.compiler.target>
|
||||
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.dataformat</groupId>
|
||||
<artifactId>jackson-dataformat-xml</artifactId>
|
||||
<version>2.15.1</version>
|
||||
<groupId>org.hibernate.orm</groupId>
|
||||
<artifactId>hibernate-core</artifactId>
|
||||
<version>6.4.1.Final</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.apache.httpcomponents</groupId>
|
||||
<artifactId>httpclient</artifactId>
|
||||
<version>4.5.13</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.core</groupId>
|
||||
<artifactId>jackson-databind</artifactId>
|
||||
<version>2.13.1</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.itextpdf</groupId>
|
||||
<artifactId>itextpdf</artifactId>
|
||||
<version>5.5.13</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-core</artifactId>
|
||||
<version>4.8.0</version>
|
||||
<scope>test</scope>
|
||||
<groupId>org.postgresql</groupId>
|
||||
<artifactId>postgresql</artifactId>
|
||||
<version>42.2.20</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>4.12</version>
|
||||
<version>4.13.2</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
@ -53,14 +38,16 @@
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>commons-io</groupId>
|
||||
<artifactId>commons-io</artifactId>
|
||||
<version>2.11.0</version>
|
||||
<groupId>org.eclipse.jdt</groupId>
|
||||
<artifactId>ecj</artifactId>
|
||||
<version>3.28.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.fasterxml.jackson.dataformat</groupId>
|
||||
<artifactId>jackson-dataformat-xml</artifactId>
|
||||
<version>2.13.1</version>
|
||||
<groupId>org.mockito</groupId>
|
||||
<artifactId>mockito-core</artifactId>
|
||||
<version>4.8.0</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
BIN
results/results2023-12-12_204630.pdf
Normal file
BIN
results/results2023-12-12_204630.pdf
Normal file
Binary file not shown.
1
results/results2023-12-12_204844.json
Normal file
1
results/results2023-12-12_204844.json
Normal file
@ -0,0 +1 @@
|
||||
[{"cityName":"chicago","description":"few clouds","temperature":276.59,"pressure":1029,"humidity":50}]
|
37
results/results2023-12-12_210942.pdf
Normal file
37
results/results2023-12-12_210942.pdf
Normal file
@ -0,0 +1,37 @@
|
||||
%PDF-1.4
|
||||
%âãÏÓ
|
||||
2 0 obj
|
||||
<</Length 185/Filter/FlateDecode>>stream
|
||||
xœåÏ;Â0†á=¿â,B…“Ö^GA…lÅ!6‘F{3I)þ{ÓQX\=Óžá{ŸhGQ”@† aH6?›½!¯’æUÀÄ”fÓšÞÁÔãBWJFö]WÕ?DUÓ<55>\;¹í 3£åñR@˜&~†<>tPBëÙÕ'f%Á8vºzl%·3Ë•UùÖiÇ9áö^…jd÷½·•Ú,ÌLý8Z’™çdAeøK垢3zŒ¾e
|
||||
endstream
|
||||
endobj
|
||||
4 0 obj
|
||||
<</Type/Page/MediaBox[0 0 595 842]/Resources<</Font<</F1 1 0 R>>>>/Contents 2 0 R/Parent 3 0 R>>
|
||||
endobj
|
||||
1 0 obj
|
||||
<</Type/Font/Subtype/Type1/BaseFont/Helvetica/Encoding/WinAnsiEncoding>>
|
||||
endobj
|
||||
3 0 obj
|
||||
<</Type/Pages/Count 1/Kids[4 0 R]>>
|
||||
endobj
|
||||
5 0 obj
|
||||
<</Type/Catalog/Pages 3 0 R>>
|
||||
endobj
|
||||
6 0 obj
|
||||
<</Producer(iText® 5.5.13 ©2000-2018 iText Group NV \(AGPL-version\))/CreationDate(D:20231212210957+01'00')/ModDate(D:20231212210957+01'00')>>
|
||||
endobj
|
||||
xref
|
||||
0 7
|
||||
0000000000 65535 f
|
||||
0000000379 00000 n
|
||||
0000000015 00000 n
|
||||
0000000467 00000 n
|
||||
0000000267 00000 n
|
||||
0000000518 00000 n
|
||||
0000000563 00000 n
|
||||
trailer
|
||||
<</Size 7/Root 5 0 R/Info 6 0 R/ID [<7473657c6d90d07a2455d7e52ef9a859><7473657c6d90d07a2455d7e52ef9a859>]>>
|
||||
%iText-5.5.13
|
||||
startxref
|
||||
721
|
||||
%%EOF
|
1
results/results2023-12-12_211006.json
Normal file
1
results/results2023-12-12_211006.json
Normal file
@ -0,0 +1 @@
|
||||
[
|
1
results/results2023-12-12_211125.json
Normal file
1
results/results2023-12-12_211125.json
Normal file
@ -0,0 +1 @@
|
||||
[{"cityName":"chicago","description":"scattered clouds","temperature":276.63,"pressure":1030,"humidity":50},{"cityName":"berlin","description":"mist","temperature":277.53,"pressure":991,"humidity":92}]
|
1
results/results2023-12-12_211148.xml
Normal file
1
results/results2023-12-12_211148.xml
Normal file
@ -0,0 +1 @@
|
||||
<ArrayList><item><cityName>vancouver</cityName><description>broken clouds</description><temperature>278.92</temperature><pressure>1024</pressure><humidity>91</humidity></item><item><cityName>warsaw</cityName><description>broken clouds</description><temperature>276.8</temperature><pressure>1005</pressure><humidity>94</humidity></item></ArrayList>
|
1
results/results2024-01-02_193747.xml
Normal file
1
results/results2024-01-02_193747.xml
Normal file
@ -0,0 +1 @@
|
||||
<ArrayList><item><cityName>berlin</cityName><description>light intensity drizzle rain</description><temperature>278.87</temperature><pressure>981</pressure><humidity>94</humidity></item><item><cityName>berlin</cityName><description>light intensity drizzle rain</description><temperature>278.87</temperature><pressure>981</pressure><humidity>94</humidity></item><item><cityName>warsaw</cityName><description>broken clouds</description><temperature>277.17</temperature><pressure>999</pressure><humidity>91</humidity></item></ArrayList>
|
BIN
results/results2024-01-02_193815.pdf
Normal file
BIN
results/results2024-01-02_193815.pdf
Normal file
Binary file not shown.
37
results/results2024-01-03_192029.pdf
Normal file
37
results/results2024-01-03_192029.pdf
Normal file
@ -0,0 +1,37 @@
|
||||
%PDF-1.4
|
||||
%âãÏÓ
|
||||
2 0 obj
|
||||
<</Length 191/Filter/FlateDecode>>stream
|
||||
xœíÏ=Â0€á=¿âA¡Å6…6í(èâ¢<C3A2>8¤Í‰Ñ~™¤ÿ½íXTgÍtÃsGÞ'ÙqÅÀ‚¸$ø!›†í!„<>¿’u©ì+ƒu¥š
¿<>&˜ÑµDSjÕYÕ6˜RX‹%”UÛKãÜ°Xw¨…í5æÇK”Q/Žœ´ÓhÌän'1Ê4aNvëk%Ç<>æ«1÷)ßñœðW‹¡<>–‹Ý>°ù*7I=š~”ËÜl–›Òîbîž“3yÈé•
|
||||
endstream
|
||||
endobj
|
||||
4 0 obj
|
||||
<</Type/Page/MediaBox[0 0 595 842]/Resources<</Font<</F1 1 0 R>>>>/Contents 2 0 R/Parent 3 0 R>>
|
||||
endobj
|
||||
1 0 obj
|
||||
<</Type/Font/Subtype/Type1/BaseFont/Helvetica/Encoding/WinAnsiEncoding>>
|
||||
endobj
|
||||
3 0 obj
|
||||
<</Type/Pages/Count 1/Kids[4 0 R]>>
|
||||
endobj
|
||||
5 0 obj
|
||||
<</Type/Catalog/Pages 3 0 R>>
|
||||
endobj
|
||||
6 0 obj
|
||||
<</Producer(iText® 5.5.13 ©2000-2018 iText Group NV \(AGPL-version\))/CreationDate(D:20240103192046+01'00')/ModDate(D:20240103192046+01'00')>>
|
||||
endobj
|
||||
xref
|
||||
0 7
|
||||
0000000000 65535 f
|
||||
0000000385 00000 n
|
||||
0000000015 00000 n
|
||||
0000000473 00000 n
|
||||
0000000273 00000 n
|
||||
0000000524 00000 n
|
||||
0000000569 00000 n
|
||||
trailer
|
||||
<</Size 7/Root 5 0 R/Info 6 0 R/ID [<76c69ed41a734d16189b7f47c42dd959><76c69ed41a734d16189b7f47c42dd959>]>>
|
||||
%iText-5.5.13
|
||||
startxref
|
||||
727
|
||||
%%EOF
|
@ -1,35 +0,0 @@
|
||||
package model;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/*
|
||||
Klasa odczytujaca oraz wypisujaca dostepne miasta z pliku .json.
|
||||
Wykorzystanie strumienia.
|
||||
*/
|
||||
|
||||
public class CityNames {
|
||||
public static void cityNamesRead(String filePath) {
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
try {
|
||||
JsonNode jsonArray = objectMapper.readTree(new File(filePath));
|
||||
|
||||
List<String> cityNames = jsonArray
|
||||
.findValuesAsText("name")
|
||||
.stream()
|
||||
.collect(Collectors.toList());
|
||||
|
||||
System.out.println("Dostępne miasta:");
|
||||
cityNames.forEach(System.out::println);
|
||||
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
package model;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/*
|
||||
Klasa odczytujaca z odpowiedzi API wyamagane informacje o prognozie pogody.
|
||||
*/
|
||||
|
||||
public class ForecastPreparation {
|
||||
|
||||
|
||||
public static weatherForecast fetchForecastData(String cityName, String response) throws IOException {
|
||||
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
JsonNode rootNode = objectMapper.readTree(response);
|
||||
|
||||
String description = rootNode.get("weather").get(0).get("description").asText();
|
||||
double temperature = rootNode.get("main").get("temp").asDouble();
|
||||
int pressure = rootNode.get("main").get("pressure").asInt();
|
||||
int humidity = rootNode.get("main").get("humidity").asInt();
|
||||
|
||||
return new weatherForecast(cityName, description, temperature, pressure, humidity);
|
||||
|
||||
}
|
||||
}
|
@ -1,49 +0,0 @@
|
||||
package model;
|
||||
|
||||
import org.apache.http.HttpEntity;
|
||||
import org.apache.http.client.ClientProtocolException;
|
||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.apache.http.impl.client.HttpClients;
|
||||
import org.apache.http.util.EntityUtils;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
/*
|
||||
Klasa tworzaca klienta Http i wykonujaca zapytanie GET
|
||||
*/
|
||||
|
||||
public class HttpClient {
|
||||
|
||||
private CloseableHttpClient httpClient;
|
||||
|
||||
public HttpClient() {
|
||||
this.httpClient = HttpClients.createDefault();
|
||||
}
|
||||
|
||||
public HttpClient(CloseableHttpClient httpClient) {
|
||||
this.httpClient = httpClient;
|
||||
}
|
||||
|
||||
// public void setHttpClient(CloseableHttpClient httpClient) {
|
||||
// this.httpClient = httpClient;
|
||||
// }
|
||||
|
||||
public String executeGetRequest(String urlString) {
|
||||
|
||||
HttpGet request = new HttpGet(urlString);
|
||||
|
||||
try (CloseableHttpResponse response = httpClient.execute(request)) {
|
||||
HttpEntity entity = response.getEntity();
|
||||
if (entity != null) {
|
||||
return EntityUtils.toString(entity);
|
||||
}
|
||||
return "";
|
||||
} catch (ClientProtocolException e) {
|
||||
throw new RuntimeException(e);
|
||||
} catch (IOException e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
}
|
@ -1,39 +0,0 @@
|
||||
package model;
|
||||
|
||||
import com.fasterxml.jackson.databind.JsonNode;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/*
|
||||
Klasa laczaca dostepne nazwy miast i ich koordynaty w mape.
|
||||
*/
|
||||
|
||||
public class JsonToMap {
|
||||
public static Map<String, Map<String, Double>> createCityMap(String jsonFile) {
|
||||
|
||||
Map<String, Map<String, Double>> cityMap = new HashMap<>();
|
||||
|
||||
try {
|
||||
ObjectMapper objectMapper = new ObjectMapper();
|
||||
JsonNode jsonArray = objectMapper.readTree(new File(jsonFile));
|
||||
|
||||
for (JsonNode jsonNode : jsonArray) {
|
||||
String cityName = jsonNode.get("name").asText();
|
||||
double latitude = jsonNode.get("latitude").asDouble();
|
||||
double longitude = jsonNode.get("longitude").asDouble();
|
||||
|
||||
Map<String, Double> cordsMap = new HashMap<>();
|
||||
cordsMap.put("latitude", latitude);
|
||||
cordsMap.put("longitude", longitude);
|
||||
|
||||
cityMap.put(cityName, cordsMap);
|
||||
}
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
return cityMap;
|
||||
}
|
||||
}
|
@ -1,32 +0,0 @@
|
||||
package model;
|
||||
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.FileWriter;
|
||||
import java.io.IOException;
|
||||
|
||||
/*
|
||||
Klasa tworzaca pusty plik temporary.
|
||||
*/
|
||||
|
||||
public class TemporaryFile {
|
||||
public static final String FILE_NAME = "temporary_file.txt";
|
||||
|
||||
public void createEmptyFile() {
|
||||
try {
|
||||
FileWriter fileWriter = new FileWriter(FILE_NAME);
|
||||
fileWriter.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void addToFile(String fileInput) {
|
||||
try {
|
||||
BufferedWriter writer = new BufferedWriter(new FileWriter(FILE_NAME, true));
|
||||
writer.write(fileInput + "\n");
|
||||
writer.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
@ -1,105 +0,0 @@
|
||||
package model;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
|
||||
import com.itextpdf.text.Document;
|
||||
import com.itextpdf.text.Paragraph;
|
||||
import com.itextpdf.text.pdf.PdfWriter;
|
||||
|
||||
import java.io.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.FileReader;
|
||||
|
||||
/*
|
||||
Klasa weatherForecast zawierajaca metody pozwalajace na zapis do poszczegolnych formatow.
|
||||
Obiekty tworzone poprzez wywolanie klasy zbierane sa do listy ulatwiajacej generacje plikow json i xml.
|
||||
Do zapisu do pdf wykorzystywany jest plik temporary zbierajacy wywolane prognozy w formacie txt.
|
||||
*/
|
||||
|
||||
public class weatherForecast {
|
||||
public static final List<weatherForecast> allEntries = new ArrayList<>();
|
||||
private final String cityName;
|
||||
private final String description;
|
||||
private final double temperature;
|
||||
private final int pressure;
|
||||
private final int humidity;
|
||||
|
||||
public weatherForecast(String cityName, String description, double temperature,
|
||||
int pressure, int humidity) {
|
||||
this.cityName = cityName;
|
||||
this.description = description;
|
||||
this.temperature = temperature;
|
||||
this.pressure = pressure;
|
||||
this.humidity = humidity;
|
||||
allEntries.add(this);
|
||||
}
|
||||
|
||||
public String prepareForecastString() {
|
||||
|
||||
String weatherForecastString = String.format("""
|
||||
city: %s
|
||||
description: %s
|
||||
temperature[K]: %.2f
|
||||
pressure[hPa]: %d
|
||||
humidity[%%]: %d
|
||||
--------------------""", this.cityName, this.description, this.temperature,
|
||||
this.pressure, this.humidity);
|
||||
|
||||
return weatherForecastString;
|
||||
}
|
||||
public static void saveToJson(String outputFile) throws IOException {
|
||||
ObjectMapper mapper = new ObjectMapper();
|
||||
mapper.writeValue(new File(outputFile), allEntries);
|
||||
}
|
||||
public static void saveToXml(String outputFile) throws IOException {
|
||||
XmlMapper xmlMapper = new XmlMapper();
|
||||
xmlMapper.writeValue(new File(outputFile), allEntries);
|
||||
}
|
||||
|
||||
public static void saveToPdf(String inputFile, String outputFile) {
|
||||
try (BufferedReader br = new BufferedReader(new FileReader(inputFile))) {
|
||||
Document document = new Document();
|
||||
PdfWriter.getInstance(document, new FileOutputStream(outputFile));
|
||||
document.open();
|
||||
|
||||
String line;
|
||||
while ((line = br.readLine()) != null) {
|
||||
document.add(new Paragraph(line));
|
||||
}
|
||||
|
||||
document.close();
|
||||
} catch (IOException e) {
|
||||
e.printStackTrace();
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public static List<weatherForecast> getAllEntries() {
|
||||
return new ArrayList<>(allEntries);
|
||||
}
|
||||
|
||||
public String getCityName() {
|
||||
return cityName;
|
||||
}
|
||||
|
||||
public String getDescription() {
|
||||
return description;
|
||||
}
|
||||
|
||||
public double getTemperature() {
|
||||
return temperature;
|
||||
}
|
||||
|
||||
public int getPressure() {
|
||||
return pressure;
|
||||
}
|
||||
|
||||
public int getHumidity() {
|
||||
return humidity;
|
||||
}
|
||||
}
|
50
src/main/java/org/example/FilmCategoryModel.java
Normal file
50
src/main/java/org/example/FilmCategoryModel.java
Normal file
@ -0,0 +1,50 @@
|
||||
package org.example;
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
|
||||
@Entity
|
||||
@Table(name="category")
|
||||
public class FilmCategoryModel {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy=GenerationType.IDENTITY)
|
||||
@Column(name="category_id")
|
||||
private int id;
|
||||
|
||||
@Column(name="name")
|
||||
private String filmCategory;
|
||||
|
||||
public FilmCategoryModel() {}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getFilmCategory() {
|
||||
return filmCategory;
|
||||
}
|
||||
|
||||
public void setFilmCategory(String filmCategory) {
|
||||
this.filmCategory = filmCategory;
|
||||
}
|
||||
|
||||
@OneToMany(mappedBy = "filmCategoryModel", fetch = FetchType.LAZY)
|
||||
private List<FilmInfoModel> filmInfoModel;
|
||||
|
||||
public FilmInfoModel getFilmInfo() {
|
||||
return (FilmInfoModel) filmInfoModel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Category{" +
|
||||
"id=" + id +
|
||||
", filmCategory='" + filmCategory + '}';
|
||||
}
|
||||
}
|
140
src/main/java/org/example/FilmInfoModel.java
Normal file
140
src/main/java/org/example/FilmInfoModel.java
Normal file
@ -0,0 +1,140 @@
|
||||
package org.example;
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.time.ZonedDateTime;
|
||||
|
||||
@Entity
|
||||
@Table(name="films_info")
|
||||
public class FilmInfoModel {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy=GenerationType.IDENTITY)
|
||||
@Column(name="film_id")
|
||||
private int id;
|
||||
|
||||
@Column(name="description")
|
||||
private String filmDescription;
|
||||
|
||||
@Column(name="release_year")
|
||||
private int releaseYear;
|
||||
|
||||
@Column(name="language_id")
|
||||
private int filmLanguage;
|
||||
|
||||
@Column(name="length")
|
||||
private int filmLength;
|
||||
|
||||
@Column(name="rating")
|
||||
private String filmRating;
|
||||
|
||||
@Column(name="category_id")
|
||||
private int filmCategory;
|
||||
|
||||
@Column(name="last_update", columnDefinition = "TIMESTAMP WITH TIME ZONE")
|
||||
private ZonedDateTime lastUpdate;
|
||||
|
||||
|
||||
public FilmInfoModel() {}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getFilmDescription() {
|
||||
return filmDescription;
|
||||
}
|
||||
|
||||
public void setFilmDescription(String filmDescription) {
|
||||
this.filmDescription = filmDescription;
|
||||
}
|
||||
|
||||
public int getReleaseYear() {
|
||||
return releaseYear;
|
||||
}
|
||||
|
||||
public void setReleaseYear(int releaseYear) {
|
||||
this.releaseYear = releaseYear;
|
||||
}
|
||||
|
||||
public int getFilmLanguage() {
|
||||
return filmLanguage;
|
||||
}
|
||||
|
||||
public void setFilmLanguage(int filmLanguage) {
|
||||
this.filmLanguage = filmLanguage;
|
||||
}
|
||||
|
||||
public int getFilmLength() {
|
||||
return filmLength;
|
||||
}
|
||||
|
||||
public void setFilmLength(int filmLength) {
|
||||
this.filmLength = filmLength;
|
||||
}
|
||||
|
||||
public String getFilmRating() {
|
||||
return filmRating;
|
||||
}
|
||||
|
||||
public void setFilmRating(String filmRating) {
|
||||
this.filmRating = filmRating;
|
||||
}
|
||||
|
||||
public int getFilmCategory() {
|
||||
return filmCategory;
|
||||
}
|
||||
|
||||
public void setFilmCategory(int filmCategory) {
|
||||
this.filmCategory = filmCategory;
|
||||
}
|
||||
|
||||
public ZonedDateTime getLastUpdate() {
|
||||
return lastUpdate;
|
||||
}
|
||||
|
||||
public void setLastUpdate(ZonedDateTime lastUpdate) {
|
||||
this.lastUpdate = lastUpdate;
|
||||
}
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "language_id", referencedColumnName = "language_id", insertable=false, updatable = false)
|
||||
private FilmLanguageModel filmLanguageModel;
|
||||
|
||||
public FilmLanguageModel getFilmLanguageModel() {
|
||||
return filmLanguageModel;
|
||||
}
|
||||
|
||||
@ManyToOne
|
||||
@JoinColumn(name = "category_id", referencedColumnName = "category_id", insertable=false, updatable = false)
|
||||
private FilmCategoryModel filmCategoryModel;
|
||||
|
||||
public FilmCategoryModel getFilmCategoryModel() {
|
||||
return filmCategoryModel;
|
||||
}
|
||||
|
||||
@OneToOne
|
||||
@JoinColumn(name = "film_id", referencedColumnName = "film_id")
|
||||
private FilmModel filmModel;
|
||||
|
||||
public FilmModel getFilmModel() {
|
||||
return filmModel;
|
||||
}
|
||||
|
||||
public void setFilmModel(FilmModel filmModel) {
|
||||
this.filmModel = filmModel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "FilmInfo{" +
|
||||
"id=" + id +
|
||||
", filmDescription=" + filmDescription + '\n' +
|
||||
", releaseYear=" + releaseYear + ", filmLanguage=" + filmLanguage + '\n' +
|
||||
", filmLength=" + filmLength + ", filmRating=" + filmRating + '\n' +
|
||||
", filmCategory=" + filmCategory + '\n' + ", lastUpdate=" + lastUpdate + '}';
|
||||
}
|
||||
}
|
49
src/main/java/org/example/FilmLanguageModel.java
Normal file
49
src/main/java/org/example/FilmLanguageModel.java
Normal file
@ -0,0 +1,49 @@
|
||||
package org.example;
|
||||
import jakarta.persistence.*;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Entity
|
||||
@Table(name="language")
|
||||
public class FilmLanguageModel {
|
||||
|
||||
@Id
|
||||
@GeneratedValue
|
||||
@Column(name="language_id")
|
||||
private int id;
|
||||
|
||||
@Column(name="language")
|
||||
private String filmLanguage;
|
||||
|
||||
public FilmLanguageModel() {}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getFilmLanguage() {
|
||||
return filmLanguage;
|
||||
}
|
||||
|
||||
public void setFilmLanguage(String filmLanguage) {
|
||||
this.filmLanguage = filmLanguage;
|
||||
}
|
||||
|
||||
@OneToMany(mappedBy = "filmLanguageModel", fetch = FetchType.LAZY)
|
||||
private List<FilmInfoModel> filmInfoModel;
|
||||
|
||||
public FilmInfoModel getFilmInfo() {
|
||||
return (FilmInfoModel) filmInfoModel;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Language{" +
|
||||
"id=" + id +
|
||||
", filmLanguage='" + filmLanguage + '}';
|
||||
}
|
||||
}
|
51
src/main/java/org/example/FilmModel.java
Normal file
51
src/main/java/org/example/FilmModel.java
Normal file
@ -0,0 +1,51 @@
|
||||
package org.example;
|
||||
import jakarta.persistence.*;
|
||||
|
||||
@Entity
|
||||
@Table(name="films")
|
||||
public class FilmModel {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy=GenerationType.IDENTITY)
|
||||
@Column(name="film_id")
|
||||
private int id;
|
||||
|
||||
@Column(name="title")
|
||||
private String filmTitle;
|
||||
|
||||
public FilmModel() {}
|
||||
|
||||
public int getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(int id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getFilmTitle() {
|
||||
return filmTitle;
|
||||
}
|
||||
|
||||
public void setFilmTitle(String filmTitle) {
|
||||
this.filmTitle = filmTitle;
|
||||
}
|
||||
|
||||
@OneToOne(mappedBy = "filmModel", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
|
||||
private FilmInfoModel filmInfo;
|
||||
|
||||
public FilmInfoModel getFilmInfo() {
|
||||
return filmInfo;
|
||||
}
|
||||
|
||||
public void setFilmInfo(FilmInfoModel filmInfo) {
|
||||
this.filmInfo = filmInfo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Film{" +
|
||||
"id=" + id +
|
||||
", filmTitle='" + filmTitle + '}';
|
||||
}
|
||||
}
|
@ -1,116 +1,52 @@
|
||||
package org.example;
|
||||
|
||||
import model.*;
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.SessionFactory;
|
||||
import org.hibernate.Transaction;
|
||||
import org.hibernate.boot.registry.StandardServiceRegistry;
|
||||
import org.hibernate.cfg.Configuration;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.*;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Objects;
|
||||
import java.util.Scanner;
|
||||
|
||||
/*
|
||||
Klasa Main
|
||||
*/
|
||||
import java.util.List;
|
||||
|
||||
public class Main {
|
||||
public static void main(String[] args) throws IOException {
|
||||
|
||||
String API_key = "4c991761f17e10358c944a3c64a3e24c";
|
||||
String fileCities = "cities.json";
|
||||
public static void main(String[] args) {
|
||||
System.out.println("Start");
|
||||
|
||||
// utworzenie listy miast wraz z ich koordynatami
|
||||
JsonToMap jsonToMap = new JsonToMap();
|
||||
Map<String, Map<String, Double>> cityMap =
|
||||
jsonToMap.createCityMap(fileCities);
|
||||
Configuration configuration = new Configuration();
|
||||
configuration.configure("hibernate.cfg.xml");
|
||||
|
||||
CityNames cityNames = new CityNames();
|
||||
cityNames.cityNamesRead(fileCities);
|
||||
SessionFactory sessionFactory = configuration.buildSessionFactory();
|
||||
|
||||
LocalDateTime czas = LocalDateTime.now();
|
||||
try (Session session = sessionFactory.openSession()) {
|
||||
|
||||
Scanner scanner = new Scanner(System.in);
|
||||
Queries queries = new Queries(session);
|
||||
// WYWOLANIE ZAPYTAN Z PARAMETRAMI
|
||||
// queries.getFilmByLangYear("Japanese", "2006");
|
||||
// queries.getFilmByLangCategory("Action", "Japanese");
|
||||
|
||||
// utworzenie pustego pliku tymczasowego przechowujacego wyniki zapytan
|
||||
TemporaryFile temporaryFile = new TemporaryFile();
|
||||
temporaryFile.createEmptyFile();
|
||||
// WYWOLANIE ZAPYTANIA STRONICOWANEGO
|
||||
// queries.getAllFilmsByPage(4, session);
|
||||
|
||||
HttpClient httpClient = new HttpClient();
|
||||
Transaction tx = null;
|
||||
try {
|
||||
tx = session.beginTransaction();
|
||||
|
||||
ForecastPreparation forecastPreparation = new ForecastPreparation();
|
||||
System.out.println("Program rozpoczal dzialanie.");
|
||||
//DODANIE DO BAZY NOWEGO REKORDU
|
||||
// FilmModel filmModel = queries.createFilmModel();
|
||||
// session.save(filmModel);
|
||||
|
||||
|
||||
// glowna petla programu
|
||||
while (true) {
|
||||
|
||||
System.out.println("Sprawdz pogode - y \n" +
|
||||
"Zakoncz i zapisz wynik - z\n" +
|
||||
"Wyjdz bez zapisywania - x");
|
||||
String input = scanner.nextLine().toLowerCase();
|
||||
|
||||
// wyswietlenie prognozy dla wskazanego miasta
|
||||
if (Objects.equals(input, "y")) {
|
||||
System.out.println("Podaj nazwe miasta: ");
|
||||
String inputCity = scanner.nextLine().toLowerCase();
|
||||
if (cityMap.containsKey(inputCity)) {
|
||||
|
||||
Map<String, Double> specificCity = (Map<String, Double>) cityMap.get(inputCity);
|
||||
double latitude = (double) specificCity.get("latitude");
|
||||
double longitude = (double) specificCity.get("longitude");
|
||||
|
||||
// wygenerowanie odpowiedniego adresu url
|
||||
String urlString = "https://api.openweathermap.org/data/2.5/weather?lat=" + latitude +
|
||||
"&lon=" + longitude + "&appid=" + API_key;
|
||||
|
||||
String response = httpClient.executeGetRequest(urlString);
|
||||
|
||||
weatherForecast weatherForecast = forecastPreparation.fetchForecastData(inputCity, response);
|
||||
String forecastString = weatherForecast.prepareForecastString();
|
||||
System.out.println(forecastString);
|
||||
|
||||
// zapisanie prognozy do pliku tymczasowego
|
||||
temporaryFile.addToFile(forecastString);
|
||||
|
||||
} else {
|
||||
System.out.println("Podanego miasta nie ma na liscie.");
|
||||
}
|
||||
// zapis wynikow
|
||||
} else if (Objects.equals(input, "z")) {
|
||||
|
||||
System.out.println("W jakim formacie chcesz zapisac wyniki?\n pdf/json/xml");
|
||||
String whichFormat = scanner.nextLine().toLowerCase();
|
||||
|
||||
// odczyt czasu na potrzeby wygenerowania nazwy pliku
|
||||
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd_HHmmss");
|
||||
String sformatowanyCzas = czas.format(formatter);
|
||||
|
||||
// zapis do pdf
|
||||
if (Objects.equals(whichFormat, "pdf")) {
|
||||
String outputFile = "results/results" + sformatowanyCzas + ".pdf" ;
|
||||
weatherForecast.saveToPdf(temporaryFile.FILE_NAME, outputFile);
|
||||
//zapis do json
|
||||
} else if (Objects.equals(whichFormat, "json")) {
|
||||
String outputFile = "results/results" + sformatowanyCzas + ".json";
|
||||
weatherForecast.saveToJson(outputFile);
|
||||
// zapis do xml
|
||||
} else if (Objects.equals(whichFormat, "xml")) {
|
||||
String outputFile = "results/results" + sformatowanyCzas + ".xml";
|
||||
weatherForecast.saveToXml(outputFile);
|
||||
} else {
|
||||
System.out.println("Wprowadz poprawna opcje.");
|
||||
continue;
|
||||
}
|
||||
System.out.println("Program zakonczyl dzialanie.");
|
||||
break;
|
||||
// wyjscie z programu
|
||||
} else if (Objects.equals(input,"x")) {
|
||||
System.out.println("Program zakonczyl dzialanie.");
|
||||
break;
|
||||
} else {
|
||||
System.out.println("Wprowadz poprawna opcje.");
|
||||
tx.commit();
|
||||
} catch (Exception e) {
|
||||
if (tx != null) {
|
||||
tx.rollback();
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
sessionFactory.close();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
120
src/main/java/org/example/Queries.java
Normal file
120
src/main/java/org/example/Queries.java
Normal file
@ -0,0 +1,120 @@
|
||||
package org.example;
|
||||
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.query.Query;
|
||||
import java.time.ZonedDateTime;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class Queries {
|
||||
|
||||
Session session;
|
||||
|
||||
public Queries(Session session) {
|
||||
this.session = session;
|
||||
}
|
||||
|
||||
// ZAPYTANIE Z PARAMETREM
|
||||
public List<Object[]> getFilmByLangYear(String language, String releaseYear) {
|
||||
|
||||
|
||||
String hql = "SELECT f1.id, f2.filmTitle, f3.filmLanguage " +
|
||||
"FROM FilmInfoModel f1 " +
|
||||
"JOIN FilmModel f2 ON f1.id = f2.id " +
|
||||
"JOIN FilmLanguageModel f3 ON f1.filmLanguage = f3.id " +
|
||||
"WHERE f3.filmLanguage = :language AND f1.releaseYear = :releaseYear";
|
||||
|
||||
Query<Object[]> query = session.createQuery(hql, Object[].class)
|
||||
.setParameter("language", language)
|
||||
.setParameter("releaseYear", releaseYear);
|
||||
List<Object[]> results = query.getResultList();
|
||||
|
||||
// wypisanie wynikow bezposrednio w konsoli
|
||||
// for (Object[] result : results) {
|
||||
//
|
||||
// int filmId = (int) result[0];
|
||||
// String filmTitle = (String) result[1];
|
||||
// String filmLanguage = (String) result[2];
|
||||
//
|
||||
// System.out.println("Film ID: " + filmId);
|
||||
// System.out.println("Film Title: " + filmTitle);
|
||||
// System.out.println("Language: " + filmLanguage);
|
||||
// System.out.println("-----------------------------------");
|
||||
// }
|
||||
return results;
|
||||
}
|
||||
|
||||
// ZAPYTANIE Z PARAMETREM
|
||||
public List<Object[]> getFilmByLangCategory(String categoryName, String languageName) {
|
||||
|
||||
String hql = "SELECT f1.id, f2.filmTitle, f3.filmLanguage, f4.filmCategory " +
|
||||
"FROM FilmInfoModel f1 " +
|
||||
"JOIN FilmModel f2 ON f1.id = f2.id " +
|
||||
"JOIN FilmLanguageModel f3 ON f1.filmLanguage = f3.id " +
|
||||
"JOIN FilmCategoryModel f4 ON f1.filmCategory = f4.id " +
|
||||
"WHERE f3.filmLanguage = :language AND f4.filmCategory = :categoryName";
|
||||
|
||||
Query<Object[]> query = session.createQuery(hql, Object[].class)
|
||||
.setParameter("categoryName", categoryName)
|
||||
.setParameter("language", languageName);
|
||||
List<Object[]> results = query.getResultList();
|
||||
// wypisanie wynikow bezposrednio w konsoli
|
||||
// for (Object[] result : results) {
|
||||
//
|
||||
// int filmId = (int) result[0];
|
||||
// String filmTitle = (String) result[1];
|
||||
// String filmCategory = (String) result[2];
|
||||
// String filmLanguage = (String) result[3];
|
||||
//
|
||||
// System.out.println("Film ID: " + filmId);
|
||||
// System.out.println("Film Title: " + filmTitle);
|
||||
// System.out.println("Category: " + filmCategory);
|
||||
// System.out.println("Film Language: " + filmLanguage);
|
||||
// System.out.println("-----------------------------------");
|
||||
// }
|
||||
return results;
|
||||
}
|
||||
|
||||
// ZAPYTANIE STRONICOWANE
|
||||
public List<FilmModel> getAllFilmsByPage(int pageNumber, Session session) {
|
||||
//calculate total number
|
||||
Query queryTotal = session.createQuery("Select count(f) from FilmModel f");
|
||||
long countResult = (long)queryTotal.getSingleResult();
|
||||
|
||||
Query<FilmModel> query = session.createQuery("Select f from FilmModel f");
|
||||
|
||||
// rozmiar i liczba stron
|
||||
int pageSize = 10;
|
||||
int pageTotal = (int) ((countResult / pageSize) + 1);
|
||||
|
||||
if (pageNumber > pageTotal) pageNumber = pageTotal;
|
||||
|
||||
query.setFirstResult((pageNumber - 1) * pageSize);
|
||||
query.setMaxResults(pageSize);
|
||||
|
||||
return query.getResultList();
|
||||
}
|
||||
|
||||
// DODANIE DO BAZY NOWEGO REKORDU
|
||||
public static FilmModel createFilmModel() {
|
||||
FilmModel filmModel = new FilmModel();
|
||||
FilmInfoModel filmInfoModel = new FilmInfoModel();
|
||||
|
||||
filmModel.setFilmTitle("Test Film Title");
|
||||
filmInfoModel.setFilmDescription("Test Movie Description");
|
||||
filmInfoModel.setReleaseYear(2023);
|
||||
filmInfoModel.setFilmLanguage(1);
|
||||
filmInfoModel.setFilmLength(100);
|
||||
filmInfoModel.setFilmRating("test");
|
||||
filmInfoModel.setFilmCategory(1);
|
||||
|
||||
// Pole ZonedDateTime
|
||||
ZonedDateTime currentTimestamp = ZonedDateTime.now();
|
||||
filmInfoModel.setLastUpdate(currentTimestamp);
|
||||
|
||||
filmModel.setFilmInfo(filmInfoModel);
|
||||
|
||||
return filmModel;
|
||||
}
|
||||
|
||||
}
|
23
src/main/resources/hibernate.cfg.xml
Normal file
23
src/main/resources/hibernate.cfg.xml
Normal file
@ -0,0 +1,23 @@
|
||||
<hibernate-configuration>
|
||||
<session-factory>
|
||||
<!-- ustawienia polaczenia z baza danych -->
|
||||
<property name="hibernate.connection.driver_class">org.postgresql.Driver</property>
|
||||
<property name="hibernate.connection.url">jdbc:postgresql://localhost:5432/PRA2024</property>
|
||||
<property name="hibernate.connection.username">postgres</property>
|
||||
<property name="hibernate.connection.password">password</property>
|
||||
|
||||
<!-- ustawienie domyslnej strefy czasowej -->
|
||||
<property name="hibernate.jdbc.time_zone">Europe/Warsaw</property>
|
||||
|
||||
<!-- inne ustawienia Hibernate -->
|
||||
<property name="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</property>
|
||||
<property name="hibernate.show_sql">true</property>
|
||||
<property name="hibernate.hbm2ddl.auto">update</property>
|
||||
|
||||
<!-- skanowanie pakietow z encjami -->
|
||||
<mapping class="org.example.FilmModel"/>
|
||||
<mapping class="org.example.FilmInfoModel"/>
|
||||
<mapping class="org.example.FilmLanguageModel"/>
|
||||
<mapping class="org.example.FilmCategoryModel"/>
|
||||
</session-factory>
|
||||
</hibernate-configuration>
|
@ -1,97 +0,0 @@
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
import model.HttpClient;
|
||||
import org.apache.http.client.ClientProtocolException;
|
||||
import org.apache.http.client.methods.CloseableHttpResponse;
|
||||
import org.apache.http.client.methods.HttpGet;
|
||||
import org.apache.http.impl.client.CloseableHttpClient;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.mockito.ArgumentMatchers;
|
||||
import org.mockito.Mockito;
|
||||
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.StandardCharsets;
|
||||
|
||||
/*
|
||||
Zgodnie z wymogami projektu - trzy testy mockujace przygotowane dla klasy HttpClient.
|
||||
*/
|
||||
|
||||
public class HttpClientTest {
|
||||
|
||||
|
||||
@Test
|
||||
void testExecuteGetRequest() throws Exception {
|
||||
|
||||
// Dowolny adres URL
|
||||
String urlString = "www.example.com";
|
||||
|
||||
// Przykladowy response
|
||||
String expectedResponse = "{\"coord\":{\"lon\":44.34,\"lat\":10.99},\"weather\":" +
|
||||
"[{\"id\":804,\"main\":\"Clouds\",\"description\":\"overcast clouds\"" +
|
||||
",\"icon\":\"04n\"}],\"base\":\"stations\",\"main\":{\"temp\":299.46,\"" +
|
||||
"feels_like\":299.46,\"temp_min\":299.46,\"temp_max\":299.46,\"pressure\"" +
|
||||
":1014,\"humidity\":66,\"sea_level\":1014,\"grnd_level\":1014},\"" +
|
||||
"visibility\":10000,\"wind\":{\"speed\":4.89,\"deg\":78,\"gust\":5.26}," +
|
||||
"\"clouds\":{\"all\":88},\"dt\":1701977972,\"sys\":{\"country\":\"SO\"," +
|
||||
"\"sunrise\":1701918532,\"sunset\":1701959952},\"timezone\":10800,\"id\"" +
|
||||
":54746,\"name\":\"Lughaye\",\"cod\":200}\n";
|
||||
|
||||
// Przygotowanie mockow
|
||||
CloseableHttpClient mockHttpClient = Mockito.mock(CloseableHttpClient.class);
|
||||
org.apache.http.HttpEntity mockEntity = Mockito.mock(org.apache.http.HttpEntity.class);
|
||||
CloseableHttpResponse mockResponse = Mockito.mock(CloseableHttpResponse.class);
|
||||
when(mockResponse.getEntity()).thenReturn(mockEntity);
|
||||
when(mockEntity.getContent()).thenReturn(new ByteArrayInputStream(expectedResponse.getBytes(StandardCharsets.UTF_8)));
|
||||
when(mockEntity.getContentLength()).thenReturn((long) expectedResponse.length());
|
||||
|
||||
// Przygotowujemy odpowiedź do zwrócenia przez mock
|
||||
when(mockHttpClient.execute(any(HttpGet.class))).thenReturn(mockResponse);
|
||||
|
||||
// Instancja testowanej klasy z przekazaniem zmockowanego klienta
|
||||
HttpClient httpClient = new HttpClient(mockHttpClient);
|
||||
|
||||
// Act & Assert
|
||||
String result = httpClient.executeGetRequest(urlString);
|
||||
assertEquals(expectedResponse, result);
|
||||
}
|
||||
|
||||
@Test
|
||||
void testExecuteGetRequest_EmptyResponse() throws IOException {
|
||||
|
||||
// Dowolny adres url
|
||||
String urlString = "www.example.com";
|
||||
|
||||
// Przygotowanie mockow
|
||||
CloseableHttpClient mockHttpClient = mock(CloseableHttpClient.class);
|
||||
CloseableHttpResponse mockHttpResponse = mock(CloseableHttpResponse.class);
|
||||
when(mockHttpClient.execute(ArgumentMatchers.any(HttpGet.class))).thenReturn(mockHttpResponse);
|
||||
when(mockHttpResponse.getEntity()).thenReturn(null);
|
||||
|
||||
// Instancja testowanej klasy z przekazaniem zmockowanego klienta
|
||||
HttpClient httpClient = new HttpClient(mockHttpClient);
|
||||
|
||||
// Act & Assert
|
||||
String result = httpClient.executeGetRequest(urlString);
|
||||
|
||||
assertEquals("", result);
|
||||
}
|
||||
@Test
|
||||
void testExecuteGetRequest_ClientProtocolException() throws IOException {
|
||||
|
||||
// Przygotowanie mockow
|
||||
CloseableHttpClient mockHttpClient = mock(CloseableHttpClient.class);
|
||||
when(mockHttpClient.execute(ArgumentMatchers.any(HttpGet.class))).thenThrow(new ClientProtocolException("Mocked ClientProtocolException"));
|
||||
|
||||
// Instancja testowanej klasy z przekazaniem zmockowanego klienta
|
||||
HttpClient httpClient = new HttpClient(mockHttpClient);
|
||||
|
||||
// Act & Assert
|
||||
RuntimeException runtimeException = assertThrows(RuntimeException.class, () ->
|
||||
httpClient.executeGetRequest("http://example.com")
|
||||
);
|
||||
assertEquals("org.apache.http.client.ClientProtocolException: Mocked ClientProtocolException", runtimeException.getMessage());
|
||||
}
|
||||
}
|
184
src/test/java/org/example/QueriesTest.java
Normal file
184
src/test/java/org/example/QueriesTest.java
Normal file
@ -0,0 +1,184 @@
|
||||
package org.example;
|
||||
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.query.Query;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.time.ZonedDateTime;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
import static org.mockito.Mockito.*;
|
||||
|
||||
public class QueriesTest {
|
||||
|
||||
private FilmModel createFilm(String title) {
|
||||
FilmModel film = new FilmModel();
|
||||
film.setFilmTitle(title);
|
||||
return film;
|
||||
}
|
||||
|
||||
// ZAPYTANIE ZA PARAMETREM
|
||||
@Test
|
||||
public void testGetFilmByLangYearWithResults() {
|
||||
// Ustawienie danych testowych
|
||||
Session mockSession = mock(Session.class);
|
||||
Query<Object[]> mockQuery = mock(Query.class);
|
||||
|
||||
List<Object[]> expectedResults = Arrays.asList(
|
||||
new Object[]{1, "Film1", "English"},
|
||||
new Object[]{2, "Film2", "Spanish"}
|
||||
);
|
||||
|
||||
when(mockSession.createQuery(anyString(), eq(Object[].class))).thenReturn(mockQuery);
|
||||
when(mockQuery.setParameter("language", "English")).thenReturn(mockQuery);
|
||||
when(mockQuery.setParameter("releaseYear", "2022")).thenReturn(mockQuery);
|
||||
when(mockQuery.getResultList()).thenReturn(expectedResults);
|
||||
|
||||
Queries queries = new Queries(mockSession);
|
||||
List<Object[]> result = queries.getFilmByLangYear("English", "2022");
|
||||
|
||||
assertEquals(expectedResults, result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetAllFilmsByPage() {
|
||||
Session mockSession = mock(Session.class);
|
||||
Query mockQueryTotal = mock(Query.class);
|
||||
Query mockQuery = mock(Query.class);
|
||||
|
||||
long totalCount = 3;
|
||||
when(mockSession.createQuery("Select count(f) from FilmModel f")).thenReturn(mockQueryTotal);
|
||||
when(mockQueryTotal.getSingleResult()).thenReturn(totalCount);
|
||||
|
||||
List<FilmModel> filmList = Arrays.asList(
|
||||
createFilm("Test1"),
|
||||
createFilm("Test2"),
|
||||
createFilm("Test3")
|
||||
);
|
||||
|
||||
when(mockSession.createQuery("Select f from FilmModel f")).thenReturn(mockQuery);
|
||||
when(mockQuery.setFirstResult(anyInt())).thenReturn(mockQuery);
|
||||
when(mockQuery.setMaxResults(anyInt())).thenReturn(mockQuery);
|
||||
when(mockQuery.getResultList()).thenReturn(filmList);
|
||||
|
||||
Queries queries = new Queries(mockSession);
|
||||
List<FilmModel> result = queries.getAllFilmsByPage(1, mockSession);
|
||||
|
||||
assertEquals(filmList, result);
|
||||
verify(mockQueryTotal).getSingleResult();
|
||||
verify(mockQuery).setFirstResult(0);
|
||||
verify(mockQuery).setMaxResults(10);
|
||||
}
|
||||
|
||||
// ZAPYTANIE Z PARAMETREM
|
||||
@Test
|
||||
public void testGetFilmByLangCategoryWithResults() {
|
||||
Session mockSession = mock(Session.class);
|
||||
Query<Object[]> mockQuery = mock(Query.class);
|
||||
|
||||
List<Object[]> expectedResults = Arrays.asList(
|
||||
new Object[]{1, "Film1", "English", "Action"},
|
||||
new Object[]{2, "Film2", "Spanish", "Drama"}
|
||||
);
|
||||
|
||||
when(mockSession.createQuery(anyString(), eq(Object[].class))).thenReturn(mockQuery);
|
||||
when(mockQuery.setParameter("categoryName", "Action")).thenReturn(mockQuery);
|
||||
when(mockQuery.setParameter("language", "English")).thenReturn(mockQuery);
|
||||
when(mockQuery.getResultList()).thenReturn(expectedResults);
|
||||
|
||||
Queries queries = new Queries(mockSession);
|
||||
List<Object[]> result = queries.getFilmByLangCategory("Action", "English");
|
||||
|
||||
assertEquals(expectedResults, result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetFilmByLangCategoryWithoutResults() {
|
||||
Session mockSession = mock(Session.class);
|
||||
Query<Object[]> mockQuery = mock(Query.class);
|
||||
|
||||
List<Object[]> expectedResults = Collections.emptyList(); // Brak wynikow
|
||||
|
||||
when(mockSession.createQuery(anyString(), eq(Object[].class))).thenReturn(mockQuery);
|
||||
when(mockQuery.setParameter("categoryName", "Comedy")).thenReturn(mockQuery);
|
||||
when(mockQuery.setParameter("language", "French")).thenReturn(mockQuery);
|
||||
when(mockQuery.getResultList()).thenReturn(expectedResults);
|
||||
|
||||
Queries queries = new Queries(mockSession);
|
||||
List<Object[]> result = queries.getFilmByLangCategory("Comedy", "French");
|
||||
|
||||
assertTrue(result.isEmpty());
|
||||
}
|
||||
|
||||
// ZAPYTANIE STRONICOWANE
|
||||
@Test
|
||||
public void testGetFilmByLangYearWithoutResults() {
|
||||
Session mockSession = mock(Session.class);
|
||||
Query<Object[]> mockQuery = mock(Query.class);
|
||||
|
||||
List<Object[]> expectedResults = Collections.emptyList(); // Brak wynikow
|
||||
|
||||
when(mockSession.createQuery(anyString(), eq(Object[].class))).thenReturn(mockQuery);
|
||||
when(mockQuery.setParameter("language", "French")).thenReturn(mockQuery);
|
||||
when(mockQuery.setParameter("releaseYear", "2022")).thenReturn(mockQuery);
|
||||
when(mockQuery.getResultList()).thenReturn(expectedResults);
|
||||
|
||||
Queries queries = new Queries(mockSession);
|
||||
List<Object[]> result = queries.getFilmByLangYear("French", "2022");
|
||||
|
||||
assertTrue(result.isEmpty());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testGetAllFilmsByPageWhenNoFilms() {
|
||||
Session mockSession = mock(Session.class);
|
||||
Query mockQueryTotal = mock(Query.class);
|
||||
Query mockQuery = mock(Query.class);
|
||||
|
||||
long totalCount = 0;
|
||||
when(mockSession.createQuery("Select count(f) from FilmModel f")).thenReturn(mockQueryTotal);
|
||||
when(mockQueryTotal.getSingleResult()).thenReturn(totalCount);
|
||||
|
||||
List<FilmModel> filmList = Arrays.asList(); // pusta lista filmów
|
||||
|
||||
when(mockSession.createQuery("Select f from FilmModel f")).thenReturn(mockQuery);
|
||||
when(mockQuery.getResultList()).thenReturn(filmList);
|
||||
|
||||
Queries queries = new Queries(mockSession);
|
||||
List<FilmModel> result = queries.getAllFilmsByPage(1, mockSession);
|
||||
|
||||
assertEquals(filmList, result);
|
||||
verify(mockQueryTotal).getSingleResult();
|
||||
}
|
||||
|
||||
// SPRAWDZENIE CZY UTWORZONY OBIEKT ZAWIERA DANE ZGODNE ZE WSTEPNIE WPROWADZONYMI W DEFINICJI METODY
|
||||
@Test
|
||||
public void testCreateFilmModelWithExpectedData() {
|
||||
Session mockSession = mock(Session.class);
|
||||
Queries queries = new Queries(mockSession);
|
||||
FilmModel filmModel = queries.createFilmModel();
|
||||
|
||||
// Sprawdzenie, czy utworzony obiekt zawiera oczekiwane dane
|
||||
assertNotNull(filmModel);
|
||||
assertEquals("Test Film Title", filmModel.getFilmTitle());
|
||||
|
||||
FilmInfoModel filmInfoModel = filmModel.getFilmInfo();
|
||||
assertNotNull(filmInfoModel);
|
||||
assertEquals("Test Movie Description", filmInfoModel.getFilmDescription());
|
||||
assertEquals(2023, filmInfoModel.getReleaseYear());
|
||||
assertEquals(1, filmInfoModel.getFilmLanguage());
|
||||
assertEquals(100, filmInfoModel.getFilmLength());
|
||||
assertEquals("test", filmInfoModel.getFilmRating());
|
||||
assertEquals(1, filmInfoModel.getFilmCategory());
|
||||
|
||||
ZonedDateTime currentTimestamp = ZonedDateTime.now();
|
||||
ZonedDateTime filmInfoTimestamp = filmInfoModel.getLastUpdate();
|
||||
|
||||
// Test timestampow z pozostawieniem pewnej tolerancji czasowej
|
||||
assertTrue(filmInfoTimestamp.isBefore(currentTimestamp.plusSeconds(5)) &&
|
||||
filmInfoTimestamp.isAfter(currentTimestamp.minusSeconds(5)));
|
||||
}
|
||||
}
|
24
temporary_file.txt
Normal file
24
temporary_file.txt
Normal file
@ -0,0 +1,24 @@
|
||||
city: berlin
|
||||
description: scattered clouds
|
||||
temperature[K]: 282,63
|
||||
pressure[hPa]: 978
|
||||
humidity[%]: 83
|
||||
--------------------
|
||||
city: berlin
|
||||
description: scattered clouds
|
||||
temperature[K]: 282,63
|
||||
pressure[hPa]: 978
|
||||
humidity[%]: 83
|
||||
--------------------
|
||||
city: warsaw
|
||||
description: broken clouds
|
||||
temperature[K]: 279,29
|
||||
pressure[hPa]: 989
|
||||
humidity[%]: 92
|
||||
--------------------
|
||||
city: warsaw
|
||||
description: broken clouds
|
||||
temperature[K]: 279,29
|
||||
pressure[hPa]: 989
|
||||
humidity[%]: 92
|
||||
--------------------
|
Loading…
Reference in New Issue
Block a user