From dc0fda419df45935d6a6abd53585921cddba4736 Mon Sep 17 00:00:00 2001 From: L3o15 Date: Mon, 26 May 2025 18:07:55 +0000 Subject: [PATCH] Parsing --- .../arnaldo/rovineperdute/Coordinata.java | 34 ++++++ src/it/unibs/arnaldo/rovineperdute/Graph.java | 31 ++++++ src/it/unibs/arnaldo/rovineperdute/Links.java | 22 ++++ .../unibs/arnaldo/rovineperdute/Parser.java | 103 ++++++++++++++++++ .../arnaldo/rovineperdute/RovinaPerduta.java | 24 ++++ 5 files changed, 214 insertions(+) create mode 100644 src/it/unibs/arnaldo/rovineperdute/Coordinata.java create mode 100644 src/it/unibs/arnaldo/rovineperdute/Graph.java create mode 100644 src/it/unibs/arnaldo/rovineperdute/Links.java create mode 100644 src/it/unibs/arnaldo/rovineperdute/Parser.java create mode 100644 src/it/unibs/arnaldo/rovineperdute/RovinaPerduta.java diff --git a/src/it/unibs/arnaldo/rovineperdute/Coordinata.java b/src/it/unibs/arnaldo/rovineperdute/Coordinata.java new file mode 100644 index 0000000..904f734 --- /dev/null +++ b/src/it/unibs/arnaldo/rovineperdute/Coordinata.java @@ -0,0 +1,34 @@ +package it.unibs.arnaldo.rovineperdute; + +public class Coordinata { + private final int x; + private final int y; + private final int altezza; + + public Coordinata(int x, int y, int altezza){ + this.altezza = altezza; + this.x = x; + this.y = y; + } + + public int getX() { + return x; + } + + public int getY() { + return y; + } + + public int getAltezza() { + return altezza; + } + + @Override + public String toString() { + return "Coordinata{" + + "x=" + x + + ", y=" + y + + ", altezza=" + altezza + + '}'; + } +} diff --git a/src/it/unibs/arnaldo/rovineperdute/Graph.java b/src/it/unibs/arnaldo/rovineperdute/Graph.java new file mode 100644 index 0000000..50eb82a --- /dev/null +++ b/src/it/unibs/arnaldo/rovineperdute/Graph.java @@ -0,0 +1,31 @@ +package it.unibs.arnaldo.rovineperdute; + +import java.util.HashMap; +import java.util.List; + +public class Graph { + private final HashMap> graph = new HashMap<>(); + + public Graph(){} + + public void add(RovinaPerduta rp, List links) { + graph.put(rp, links); + } + + public List getListaCollegamenti(RovinaPerduta rp){ + return graph.get(rp); + } + + @Override + public String toString() { + StringBuilder ret = new StringBuilder(); + for (RovinaPerduta rp : graph.keySet()){ + ret.append(rp.toString()).append(": \n"); + List rovineCollegate = graph.get(rp); + for (RovinaPerduta rpCollegata: rovineCollegate){ + ret.append("\t").append(rpCollegata.toString()).append("\n"); + } + } + return ret.toString(); + } +} diff --git a/src/it/unibs/arnaldo/rovineperdute/Links.java b/src/it/unibs/arnaldo/rovineperdute/Links.java new file mode 100644 index 0000000..6e0d804 --- /dev/null +++ b/src/it/unibs/arnaldo/rovineperdute/Links.java @@ -0,0 +1,22 @@ +package it.unibs.arnaldo.rovineperdute; + +import java.util.HashMap; +import java.util.List; + +public class Links { + private final HashMap> mappaCollegamenti; + private final HashMap mappa; + + public Links(HashMap mappa, HashMap> mappaCollegamenti) { + this.mappa = mappa; + this.mappaCollegamenti = mappaCollegamenti; + } + + public HashMap> getMappaCollegamenti() { + return mappaCollegamenti; + } + + public HashMap getMappa() { + return mappa; + } +} diff --git a/src/it/unibs/arnaldo/rovineperdute/Parser.java b/src/it/unibs/arnaldo/rovineperdute/Parser.java new file mode 100644 index 0000000..c0a3d27 --- /dev/null +++ b/src/it/unibs/arnaldo/rovineperdute/Parser.java @@ -0,0 +1,103 @@ +package it.unibs.arnaldo.rovineperdute; + +import javax.xml.stream.*; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +public class Parser { + + // rovina = città + public static void parseRovinePerduteXML(String fileName) { + + XMLInputFactory xmlif; + XMLStreamReader xmlr = null; + String currentElement = null; + + // momentanea + List link = new ArrayList<>(); + + // mappa id -> rovina + HashMap rovineMap = new HashMap<>(); + + // mappa id -> link collegamenti + HashMap> mappaCollegamenti = new HashMap<>(); + + // variabili momentanee + int cityId = -1; + int x = -1; + int y = -1; + int h = -1; + String nome = null; + + try (FileInputStream reader = new FileInputStream(fileName)) { + xmlif = XMLInputFactory.newInstance(); + xmlr = xmlif.createXMLStreamReader(fileName, reader); + + while (xmlr.hasNext()) { + int event = xmlr.getEventType(); + + switch (event) { + case XMLStreamConstants.START_ELEMENT: + currentElement = xmlr.getLocalName(); + if (currentElement.equals("city")) { + cityId = Integer.parseInt(xmlr.getAttributeValue(null, "id")); + nome = xmlr.getAttributeValue(null, "name"); + x = Integer.parseInt(xmlr.getAttributeValue(null, "x")); + y = Integer.parseInt(xmlr.getAttributeValue(null, "y")); + h = Integer.parseInt(xmlr.getAttributeValue(null, "h")); + } + if (currentElement.equals("link")) { + link.add(Integer.parseInt(xmlr.getAttributeValue(null, "to"))); + } + break; + + case XMLStreamConstants.END_ELEMENT: + String endTag = xmlr.getLocalName(); + + if (endTag.equals("city")) { + mappaCollegamenti.put(cityId, link); + link = new ArrayList<>(); + RovinaPerduta rovinaPerduta = new RovinaPerduta(new Coordinata(x, y, h), nome); + nome = null; + x = -1; + y = -1; + h = -1; + + if (cityId != -1){ + rovineMap.put(cityId, rovinaPerduta); + } + + cityId = -1; + } + + break; + } + + xmlr.next(); + } + + xmlr.close(); + Graph grafo = new Graph(); + + for (Integer idx : mappaCollegamenti.keySet()){ + List listaIndiciCollegamenti = mappaCollegamenti.get(idx); + List listaCollegamenti = new ArrayList<>(); + RovinaPerduta rp = rovineMap.get(idx); + + for(int i : listaIndiciCollegamenti){ + listaCollegamenti.add(rovineMap.get(i)); + } + + grafo.add(rp, listaCollegamenti); + } + + System.out.println(grafo); + + } catch (FactoryConfigurationError | XMLStreamException | IOException e) { + System.out.println("Error reading the file: " + e.getMessage()); + } + } +} diff --git a/src/it/unibs/arnaldo/rovineperdute/RovinaPerduta.java b/src/it/unibs/arnaldo/rovineperdute/RovinaPerduta.java new file mode 100644 index 0000000..baa6c6e --- /dev/null +++ b/src/it/unibs/arnaldo/rovineperdute/RovinaPerduta.java @@ -0,0 +1,24 @@ +package it.unibs.arnaldo.rovineperdute; + +public class RovinaPerduta { + private final Coordinata coordinata; + private final String nome; + + public RovinaPerduta(Coordinata coordinata, String nome) { + this.coordinata = coordinata; + this.nome = nome; + } + + public Coordinata getCoordinata() { + return coordinata; + } + + public String getNome() { + return nome; + } + + @Override + public String toString() { + return nome + " (" + coordinata.getX() + ", " + coordinata.getY() + ", " + coordinata.getAltezza() + ")"; + } +}