Base - no tests yet

This commit is contained in:
mmgul562 2023-12-07 18:59:41 +01:00
commit 3445834fa7
14 changed files with 536 additions and 0 deletions

38
.gitignore vendored Normal file
View File

@ -0,0 +1,38 @@
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### IntelliJ IDEA ###
.idea/modules.xml
.idea/jarRepositories.xml
.idea/compiler.xml
.idea/libraries/
*.iws
*.iml
*.ipr
### Eclipse ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/
### Mac OS ###
.DS_Store

8
.idea/.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
# Default ignored files
/shelf/
/workspace.xml
# Editor-based HTTP Client requests
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

7
.idea/encodings.xml Normal file
View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/src/main/resources" charset="UTF-8" />
</component>
</project>

View File

@ -0,0 +1,67 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="AutoCloseableResource" enabled="true" level="WARNING" enabled_by_default="true">
<option name="METHOD_MATCHER_CONFIG" value="java.util.Formatter,format,java.io.Writer,append,com.google.common.base.Preconditions,checkNotNull,org.hibernate.Session,close,java.io.PrintWriter,printf,java.io.PrintStream,printf,org.apache.http.impl.client.HttpClients,createDefault" />
</inspection_tool>
<inspection_tool class="PyCompatibilityInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ourVersions">
<value>
<list size="7">
<item index="0" class="java.lang.String" itemvalue="3.7" />
<item index="1" class="java.lang.String" itemvalue="3.8" />
<item index="2" class="java.lang.String" itemvalue="3.9" />
<item index="3" class="java.lang.String" itemvalue="3.10" />
<item index="4" class="java.lang.String" itemvalue="3.11" />
<item index="5" class="java.lang.String" itemvalue="3.10" />
<item index="6" class="java.lang.String" itemvalue="3.11" />
</list>
</value>
</option>
</inspection_tool>
<inspection_tool class="PyPackageRequirementsInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredPackages">
<value>
<list size="24">
<item index="0" class="java.lang.String" itemvalue="httpx" />
<item index="1" class="java.lang.String" itemvalue="six" />
<item index="2" class="java.lang.String" itemvalue="python-dateutil" />
<item index="3" class="java.lang.String" itemvalue="aiofiles" />
<item index="4" class="java.lang.String" itemvalue="h11" />
<item index="5" class="java.lang.String" itemvalue="MarkupSafe" />
<item index="6" class="java.lang.String" itemvalue="numpy" />
<item index="7" class="java.lang.String" itemvalue="rfc3986" />
<item index="8" class="java.lang.String" itemvalue="click" />
<item index="9" class="java.lang.String" itemvalue="Jinja2" />
<item index="10" class="java.lang.String" itemvalue="sniffio" />
<item index="11" class="java.lang.String" itemvalue="demjson" />
<item index="12" class="java.lang.String" itemvalue="addict" />
<item index="13" class="java.lang.String" itemvalue="pandas" />
<item index="14" class="java.lang.String" itemvalue="starlette" />
<item index="15" class="java.lang.String" itemvalue="certifi" />
<item index="16" class="java.lang.String" itemvalue="pytz" />
<item index="17" class="java.lang.String" itemvalue="uvicorn" />
<item index="18" class="java.lang.String" itemvalue="itsdangerous" />
<item index="19" class="java.lang.String" itemvalue="justpy" />
<item index="20" class="java.lang.String" itemvalue="websockets" />
<item index="21" class="java.lang.String" itemvalue="httpcore" />
<item index="22" class="java.lang.String" itemvalue="idna" />
<item index="23" class="java.lang.String" itemvalue="psycopg2" />
</list>
</value>
</option>
</inspection_tool>
<inspection_tool class="PyUnresolvedReferencesInspection" enabled="true" level="WARNING" enabled_by_default="true">
<option name="ignoredIdentifiers">
<list>
<option value="blog.models.Post.objects" />
<option value="reviews.models.Review.objects" />
<option value="django.db.models.fields.related.OneToOneField.email" />
<option value="accounts.models.UserProfile.objects" />
<option value="accounts.models.User.DoesNotExist" />
<option value="vendor.models.Vendor.objects" />
</list>
</option>
</inspection_tool>
</profile>
</component>

14
.idea/misc.xml Normal file
View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_17" default="true" project-jdk-name="17" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

6
.idea/vcs.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

BIN
AbhayaLibre-Regular.ttf Normal file

Binary file not shown.

26
cities.json Normal file
View File

@ -0,0 +1,26 @@
{
"Warszawa": {
"lat": 52.237049,
"lon": 21.017532
},
"Berlin": {
"lat": 52.520008,
"lon": 13.404954
},
"Paryz": {
"lat": 48.8566,
"lon": 2.3522
},
"Waszyngton": {
"lat": 38.8951,
"lon": -77.0364
},
"Tokio": {
"lat": 35.6895,
"lon": 139.6917
},
"Kair": {
"lat": 30.0444,
"lon": 31.2357
}
}

61
pom.xml Normal file
View File

@ -0,0 +1,61 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>PRA2024</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.16.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-xml -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
<version>2.16.0</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.10</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.29</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-core -->
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>5.8.0</version>
<scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter-api -->
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.10.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,3 @@
package org.mikgul;
public record Coordinates(double latitude, double longitude) { }

View File

@ -0,0 +1,63 @@
package org.mikgul;
import java.io.IOException;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
Map<String, Coordinates> cities;
try {
cities = WeatherApp.prepareCities();
} catch (IOException e) {
System.out.println("Blad przy wczytywaniu danych z `cities.json`: " + e);
return;
}
Scanner scanner = new Scanner(System.in);
while (true) {
System.out.print("Podaj nazwe miasta (q - wyjscie):\n>> ");
String cityName = scanner.nextLine();
// uzytkownik chce wyjsc z programu
if ("q".equalsIgnoreCase(cityName)) {
System.out.print("Podaj format do zapisu - pdf/json/xml (q - wyjscie bez zapisu):\n>> ");
String format = scanner.nextLine().toLowerCase();
try {
switch (format) {
case "json":
WeatherEntry.saveToJson();
System.out.println("Zapisano w JSON.");
break;
case "xml":
WeatherEntry.saveToXml();
System.out.println("Zapisano w XML.");
break;
case "pdf":
WeatherEntry.saveToPdf();
System.out.println("Zapisano w PDF.");
break;
case "q":
System.out.println("Nie zapisano w zadnym pliku.");
break;
default:
System.out.println("Nieprawidlowy format.");
continue;
}
} catch (IOException e) {
System.out.println("Blad podczas zapisu do pliku: " + e);
}
break;
}
// uzytkownik chce otrzymac dane o podanym miescie
Coordinates coordinates = cities.get(cityName);
if (coordinates != null) {
WeatherEntry entry = WeatherApp.getWeatherData(cityName, coordinates);
System.out.println(entry);
} else {
System.out.println("Podane miasto nie jest obslugiwane (sprawdz plik `cities.json`).\n");
}
}
}
}

View File

@ -0,0 +1,93 @@
package org.mikgul;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpEntity;
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 java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.stream.Collectors;
import java.util.stream.StreamSupport;
public class WeatherApp {
private static final String API_KEY = "c1a110184e10999b88cc360d8580ef57";
private static final String API_URL = "https://api.openweathermap.org/data/2.5/weather";
public static WeatherEntry getWeatherData(String cityName, Coordinates coordinates) {
String apiUrl = buildApiUrl(coordinates.latitude(), coordinates.longitude());
try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
HttpGet request = new HttpGet(apiUrl);
try (CloseableHttpResponse response = httpclient.execute(request)) {
HttpEntity entity = response.getEntity();
return parseWeatherEntry(cityName, entity);
}
} catch (IOException e) {
// Handle exceptions more gracefully, log or rethrow as appropriate
throw new RuntimeException("Error fetching weather data", e);
}
}
private static String buildApiUrl(double latitude, double longitude) {
return String.format("%s?lat=%s&lon=%s&appid=%s&lang=pl&units=metric", API_URL, latitude, longitude, API_KEY);
}
private static WeatherEntry parseWeatherEntry(String cityName, HttpEntity entity) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(entity.getContent());
String desc = rootNode.get("weather").get(0).get("description").asText();
double temp = rootNode.get("main").get("temp").asDouble();
int press = rootNode.get("main").get("pressure").asInt();
int hum = rootNode.get("main").get("humidity").asInt();
return new WeatherEntry(cityName, desc, temp, press, hum);
}
// public static Map<String, Coordinates> prepareCities() throws IOException {
// File jsonFile = new File("cities.json");
// ObjectMapper objectMapper = new ObjectMapper();
// JsonNode rootNode = objectMapper.readTree(jsonFile);
//
// Map<String, Coordinates> citiesMap = new HashMap<>();
//
// Iterator<Map.Entry<String, JsonNode>> fields = rootNode.fields();
// while (fields.hasNext()) {
// Map.Entry<String, JsonNode> cityEntry = fields.next();
// String cityName = cityEntry.getKey();
//
// JsonNode coordinatesNode = cityEntry.getValue();
// double latitude = coordinatesNode.get("lat").asDouble();
// double longitude = coordinatesNode.get("lon").asDouble();
//
// Coordinates coordinates = new Coordinates(latitude, longitude);
// citiesMap.put(cityName, coordinates);
// }
// return citiesMap;
// }
public static Map<String, Coordinates> prepareCities() throws IOException {
File jsonFile = new File("cities.json");
ObjectMapper objectMapper = new ObjectMapper();
JsonNode rootNode = objectMapper.readTree(jsonFile);
return StreamSupport.stream(Spliterators.spliteratorUnknownSize(rootNode.fields(), Spliterator.ORDERED), false)
.collect(Collectors.toMap(
Map.Entry::getKey,
entry -> new Coordinates(
entry.getValue().get("lat").asDouble(),
entry.getValue().get("lon").asDouble()
),
(existing, replacement) -> existing,
HashMap::new
));
}
}

View File

@ -0,0 +1,128 @@
package org.mikgul;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import java.io.FileWriter;
import java.io.IOException;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
public class WeatherEntry {
private static final List<WeatherEntry> allEntries = new ArrayList<>();
private final String miasto;
private final String pogoda;
private final double temperatura;
private final int cisnienie;
private final int wilgotnosc;
public WeatherEntry(String city, String description, double temperature, int pressure, int humidity) {
this.miasto = city;
this.pogoda = description;
this.temperatura = temperature;
this.cisnienie = pressure;
this.wilgotnosc = humidity;
allEntries.add(this);
}
public static void saveToJson() throws IOException {
File jsonFile = new File(generateFileName(".json"));
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(jsonFile, allEntries);
}
public static void saveToXml() throws IOException {
File xmlFile = new File(generateFileName(".xml"));
XmlMapper mapper = new XmlMapper();
mapper.writeValue(xmlFile, allEntries);
}
public static void saveToPdf() throws IOException {
// zapis do txt
String txtFile = "src/weather-results/temp/temp.txt";
try (FileWriter writer = new FileWriter(txtFile)) {
for (WeatherEntry entry : allEntries) {
writer.write(entry.toString() + System.lineSeparator());
}
}
// konwersja na pdf
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
List<String> lines = Files.readAllLines(Paths.get(txtFile));
PDFont font = PDType0Font.load(document, new File("C:\\Users\\user\\IdeaProjects\\PRA2024\\AbhayaLibre-Regular.ttf"));
int yPosition = 700;
for (String line : lines) {
contentStream.beginText();
contentStream.setFont(font, 14);
contentStream.newLineAtOffset(100, yPosition);
contentStream.showText(line);
contentStream.endText();
yPosition -= 20;
}
}
document.save(generateFileName(".pdf"));
document.close();
}
private static String generateFileName(String format) {
String directoryPath = "src/weather-results/";
String baseFileName = "weather-session-";
File directory = new File(directoryPath);
int i = 1;
while (true) {
String newFileName = baseFileName + i + format;
File newFile = new File(directory, newFileName);
if (!newFile.exists()) {
return directoryPath + newFileName;
}
i++;
}
}
public String toString() {
return String.format("Pogoda w %s:\n%s, temperatura: %.2f C; cisnienie: %d hPa; wilgotnosc: %d%%\n",
miasto, pogoda, temperatura, cisnienie, wilgotnosc);
}
public static List<WeatherEntry> getAllEntries() {
return new ArrayList<>(allEntries);
}
public String getMiasto() {
return miasto;
}
public String getPogoda() {
return pogoda;
}
public double getTemperatura() {
return temperatura;
}
public int getCisnienie() {
return cisnienie;
}
public int getWilgotnosc() {
return wilgotnosc;
}
}

View File

@ -0,0 +1,22 @@
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.http.HttpEntity;
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.mikgul.Coordinates;
import org.mikgul.WeatherApp;
import org.mikgul.WeatherEntry;
import org.mockito.Mock;
import org.mockito.Mockito;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;
public class WeatherAppTest {
}