From ef726f68c2fd48956df0a47df26049b57988294a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miko=C5=82aj=20Krenc?= Date: Sat, 16 Dec 2023 22:53:34 +0100 Subject: [PATCH] efekt 1 --- .gitignore | 38 ++++++ .idea/.gitignore | 8 ++ .idea/encodings.xml | 7 ++ .idea/misc.xml | 13 ++ pom.xml | 65 ++++++++++ .../java/projekt/CityCoordinatesLoader.java | 24 ++++ src/main/java/projekt/Coordinates.java | 22 ++++ src/main/java/projekt/DataSaver.java | 21 ++++ src/main/java/projekt/DataSaver2.java | 56 +++++++++ src/main/java/projekt/Main.java | 112 ++++++++++++++++++ src/main/java/projekt/WeatherService.java | 31 +++++ src/main/java/projekt/XmlCreator.java | 36 ++++++ src/main/resources/miasta.json | 7 ++ src/main/resources/pogoda.json | 1 + src/main/resources/pogoda.pdf | 1 + src/main/resources/pogoda.xml | 1 + 16 files changed, 443 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.gitignore create mode 100644 .idea/encodings.xml create mode 100644 .idea/misc.xml create mode 100644 pom.xml create mode 100644 src/main/java/projekt/CityCoordinatesLoader.java create mode 100644 src/main/java/projekt/Coordinates.java create mode 100644 src/main/java/projekt/DataSaver.java create mode 100644 src/main/java/projekt/DataSaver2.java create mode 100644 src/main/java/projekt/Main.java create mode 100644 src/main/java/projekt/WeatherService.java create mode 100644 src/main/java/projekt/XmlCreator.java create mode 100644 src/main/resources/miasta.json create mode 100644 src/main/resources/pogoda.json create mode 100644 src/main/resources/pogoda.pdf create mode 100644 src/main/resources/pogoda.xml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5ff6309 --- /dev/null +++ b/.gitignore @@ -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 \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -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 diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..aa00ffa --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..c3f3b0a --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..876868a --- /dev/null +++ b/pom.xml @@ -0,0 +1,65 @@ + + + 4.0.0 + + org.example + Projekt-nr-1 + 1.0-SNAPSHOT + + + 17 + 17 + UTF-8 + + + + com.fasterxml.jackson.core + jackson-databind + 2.12.3 + + + org.apache.httpcomponents + httpclient + 4.5.10 + + + com.fasterxml.jackson.core + jackson-core + 2.12.3 + + + javax.xml.bind + jaxb-api + 2.3.1 + + + com.sun.xml.bind + jaxb-core + 2.3.0.1 + + + com.sun.xml.bind + jaxb-impl + 2.3.0.1 + + + javax.activation + activation + 1.1.1 + + + org.glassfish.jaxb + jaxb-runtime + 2.3.3 + + + com.itextpdf + itextpdf + 5.5.13.1 + + + + + \ No newline at end of file diff --git a/src/main/java/projekt/CityCoordinatesLoader.java b/src/main/java/projekt/CityCoordinatesLoader.java new file mode 100644 index 0000000..e9ba09f --- /dev/null +++ b/src/main/java/projekt/CityCoordinatesLoader.java @@ -0,0 +1,24 @@ +package projekt; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.File; +import java.io.IOException; +import java.util.Collections; +import java.util.Map; + +public class CityCoordinatesLoader { + + public static Map loadCityCoordinates(String jsonFilePath) { + ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.readValue(new File(jsonFilePath), + new TypeReference>() { + }); + } catch (IOException e) { + e.printStackTrace(); + return Collections.emptyMap(); + } + } +} diff --git a/src/main/java/projekt/Coordinates.java b/src/main/java/projekt/Coordinates.java new file mode 100644 index 0000000..7f30116 --- /dev/null +++ b/src/main/java/projekt/Coordinates.java @@ -0,0 +1,22 @@ +package projekt; + +public class Coordinates { + private double lat; + private double lon; + + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLon() { + return lon; + } + + public void setLon(double lon) { + this.lon = lon; + } +} diff --git a/src/main/java/projekt/DataSaver.java b/src/main/java/projekt/DataSaver.java new file mode 100644 index 0000000..e8dd811 --- /dev/null +++ b/src/main/java/projekt/DataSaver.java @@ -0,0 +1,21 @@ +package projekt; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; + +import java.io.File; +import java.io.IOException; + +public class DataSaver { + + public static void saveDataAsJson(String data, String filePath) { + ObjectMapper mapper = new ObjectMapper(); + try { + ObjectNode dataNode = mapper.createObjectNode(); + dataNode.put("weatherData", data); + mapper.writeValue(new File(filePath), dataNode); + } catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/projekt/DataSaver2.java b/src/main/java/projekt/DataSaver2.java new file mode 100644 index 0000000..4744ab3 --- /dev/null +++ b/src/main/java/projekt/DataSaver2.java @@ -0,0 +1,56 @@ +package projekt; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.itextpdf.text.Document; +import com.itextpdf.text.DocumentException; +import com.itextpdf.text.Paragraph; +import com.itextpdf.text.pdf.PdfWriter; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; + +public class DataSaver2 { + + public static void saveAsJson(String data, String filePath) { + ObjectMapper mapper = new ObjectMapper(); + ObjectNode node = mapper.createObjectNode(); + node.put("weatherData", data); + + try { + mapper.writeValue(new File(filePath), node); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void saveAsXml(org.w3c.dom.Document doc, String filePath) { + try { + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + DOMSource source = new DOMSource(doc); + StreamResult result = new StreamResult(new File(filePath)); + + transformer.transform(source, result); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void saveAsPdf(String data, String filePath) { + Document pdfDocument = new Document(); + try { + PdfWriter.getInstance(pdfDocument, new FileOutputStream(filePath)); + pdfDocument.open(); + pdfDocument.add(new Paragraph(data)); + pdfDocument.close(); + } catch (FileNotFoundException | DocumentException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/projekt/Main.java b/src/main/java/projekt/Main.java new file mode 100644 index 0000000..1ec645c --- /dev/null +++ b/src/main/java/projekt/Main.java @@ -0,0 +1,112 @@ +package projekt; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import java.io.StringReader; +import java.util.*; + +public class Main { + public static void main(String[] args) { + try { + String jsonFilePath = "src/main/resources/miasta.json"; + String chosenCity; + String temperature = "", pressure = "", humidity = ""; + Map cityCoordinatesMap = CityCoordinatesLoader.loadCityCoordinates(jsonFilePath); + List miasta = new ArrayList<>(cityCoordinatesMap.keySet()); + + Set formatyZapisu = new HashSet<>(Arrays.asList("PDF", "JSON", "XML")); + Scanner scan = new Scanner(System.in); + + while (true) { + System.out.println("P-Podaj miasto, Z-Zakończ"); + String opcja1 = scan.nextLine(); + + switch (opcja1) { + case "P": + chosenCity = wybierzMiastoIWyswietlDane(scan, miasta); + WeatherService weatherService = new WeatherService(); + Coordinates coords = cityCoordinatesMap.get(chosenCity); + String xmlString = weatherService.getWeatherData(String.valueOf(coords.getLat()), String.valueOf(coords.getLon())); + + DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); + Document doc = dBuilder.parse(new InputSource(new StringReader(xmlString))); + + doc.getDocumentElement().normalize(); + + temperature = getAttributeValue(doc, "temperature", "value"); + pressure = getAttributeValue(doc, "pressure", "value"); + humidity = getAttributeValue(doc, "humidity", "value"); + + System.out.println("Temperatura: " + temperature + "°C"); + System.out.println("Ciśnienie: " + pressure + " hPa"); + System.out.println("Wilgotność: " + humidity + "%"); + break; + case "Z": + if (wybierzFormatIZapisz(scan, formatyZapisu, temperature, pressure, humidity)) { + return; + } + break; + default: + System.out.println("Podano niedostępną opcję!"); + break; + } + } + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static String wybierzMiastoIWyswietlDane(Scanner scan, List miasta) { + String miasto; + while (true) { + System.out.println("Dostępne miasta: " + String.join(", ", miasta)); + miasto = scan.nextLine(); + if (miasta.contains(miasto)) { + break; + } else { + System.out.println("Nie można wyświetlić danych dla podanego miasta."); + } + } + return miasto; + } + + private static boolean wybierzFormatIZapisz(Scanner scan, Set formatyZapisu, String temperature, String pressure, String humidity) { + while (true) { + System.out.print("Podaj format zapisu [PDF, JSON, XML]: "); + String opcja2 = scan.nextLine(); + if (formatyZapisu.contains(opcja2)) { + System.out.println("Zapis w formacie " + opcja2); + String danePogodowe = temperature + "°C, " + pressure + "hPa, " + humidity + "%"; + if (Objects.equals(opcja2, "PDF")) { + DataSaver2.saveAsPdf(danePogodowe, "src/main/resources/pogoda.pdf"); + } else if (Objects.equals(opcja2, "JSON")) { + DataSaver2.saveAsJson(danePogodowe, "src/main/resources/pogoda.json"); + } else if (Objects.equals(opcja2, "XML")) { + Document weatherDoc = XmlCreator.createWeatherDocument(temperature, pressure, humidity); + if (weatherDoc != null) { + DataSaver2.saveAsXml(weatherDoc, "src/main/resources/pogoda.xml"); + } + } + return true; + } else { + System.out.println("Podano niewłaściwy format!"); + } + } + } + + private static String getAttributeValue(Document doc, String tagName, String attribute) { + NodeList nodeList = doc.getElementsByTagName(tagName); + if (nodeList != null && nodeList.getLength() > 0) { + Element element = (Element) nodeList.item(0); + return element.getAttribute(attribute); + } + return ""; + } + +} + diff --git a/src/main/java/projekt/WeatherService.java b/src/main/java/projekt/WeatherService.java new file mode 100644 index 0000000..73eea66 --- /dev/null +++ b/src/main/java/projekt/WeatherService.java @@ -0,0 +1,31 @@ +package projekt; + +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 org.apache.http.util.EntityUtils; + +import java.io.IOException; + +public class WeatherService { + + private static final String API_KEY = "d1c62029fc387217638fd3deda524ece"; + private static final String BASE_URL = "https://api.openweathermap.org/data/2.5/weather"; + + public String getWeatherData(String lat, String lon) { + String url = String.format("%s?lat=%s&lon=%s&appid=%s&units=metric&mode=xml", BASE_URL, lat, lon, API_KEY); + + try (CloseableHttpClient httpClient = HttpClients.createDefault()) { + HttpGet request = new HttpGet(url); + try (CloseableHttpResponse response = httpClient.execute(request)) { + HttpEntity entity = response.getEntity(); + return entity != null ? EntityUtils.toString(entity) : null; + } + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/src/main/java/projekt/XmlCreator.java b/src/main/java/projekt/XmlCreator.java new file mode 100644 index 0000000..b0126ab --- /dev/null +++ b/src/main/java/projekt/XmlCreator.java @@ -0,0 +1,36 @@ +package projekt; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; + +public class XmlCreator { + + public static Document createWeatherDocument(String temperature, String pressure, String humidity) { + try { + DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + + Document doc = docBuilder.newDocument(); + Element rootElement = doc.createElement("WeatherData"); + doc.appendChild(rootElement); + + appendWeatherElement(doc, rootElement, "Temperatura", temperature); + appendWeatherElement(doc, rootElement, "Ciśnienie", pressure); + appendWeatherElement(doc, rootElement, "Wilgotność", humidity); + + return doc; + + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + private static void appendWeatherElement(Document doc, Element parent, String name, String value) { + Element element = doc.createElement(name); + element.appendChild(doc.createTextNode(value)); + parent.appendChild(element); + } +} diff --git a/src/main/resources/miasta.json b/src/main/resources/miasta.json new file mode 100644 index 0000000..8de0d9c --- /dev/null +++ b/src/main/resources/miasta.json @@ -0,0 +1,7 @@ +{ + "Warszawa": {"lat": 52.2298, "lon": 21.0118}, + "Szczecin": {"lat": 53.4285, "lon": 14.5528}, + "Łódź": {"lat": 51.7592, "lon": 19.4560}, + "Poznań": {"lat": 52.4064, "lon": 16.9252}, + "Białystok": {"lat": 53.1325, "lon": 23.1688} +} diff --git a/src/main/resources/pogoda.json b/src/main/resources/pogoda.json new file mode 100644 index 0000000..784ab6c --- /dev/null +++ b/src/main/resources/pogoda.json @@ -0,0 +1 @@ +{"weatherData":"7.8°C, 1028hPa, 88%"} \ No newline at end of file diff --git a/src/main/resources/pogoda.pdf b/src/main/resources/pogoda.pdf new file mode 100644 index 0000000..784ab6c --- /dev/null +++ b/src/main/resources/pogoda.pdf @@ -0,0 +1 @@ +{"weatherData":"7.8°C, 1028hPa, 88%"} \ No newline at end of file diff --git a/src/main/resources/pogoda.xml b/src/main/resources/pogoda.xml new file mode 100644 index 0000000..02e37c9 --- /dev/null +++ b/src/main/resources/pogoda.xml @@ -0,0 +1 @@ +20101380 \ No newline at end of file