Commit bab2414b by Patryk Czarnik

Przelicznik walut - wersja XML

parent ec8781c5
package waluty.wersja_xml;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.net.URL;
import java.time.LocalDate;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class ObslugaNBP {
private static final String ADRES = "http://api.nbp.pl/api/exchangerates/tables";
/** Pobiera tabelę z bieżącymi kursami walut.
* Zwraca null w przypadku błędów.
*/
public static Tabela pobierzBiezaceKursy() {
Document doc = wczytajXmlZAdresu(ADRES + "/A?format=xml");
return tabelaZXml(doc);
}
/** Pobiera tabelę z archiwalnymi kursami walut z określonej daty.
* Zwraca null w przypadku błędów, np. wtedy, gdy dla danej daty nie istnieje tabela.
*/
public static Tabela pobierzKursyHistoryczne(String data) {
Document doc = wczytajXmlZAdresu(ADRES + "/A/" + data + "?format=xml");
return tabelaZXml(doc);
}
private static Document wczytajXmlZAdresu(String adres) {
// Document Object Model
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
URL url = new URL(adres);
try (InputStream in = url.openStream()) {
return db.parse(in);
}
} catch (ParserConfigurationException | SAXException | IOException e) {
e.printStackTrace();
return null;
}
}
private static Tabela tabelaZXml(Document doc) {
if (doc == null)
return null;
try {
XPathFactory xpf = XPathFactory.newInstance();
XPath xpath = xpf.newXPath();
// String numer = xpath.evaluate(
// "/ArrayOfExchangeRatesTable/ExchangeRatesTable/No", doc);
String nazwaTabeli = xpath.evaluate("//Table", doc);
String numerTabeli = xpath.evaluate("//No", doc);
LocalDate data = LocalDate.parse(xpath.evaluate("//EffectiveDate", doc));
Tabela tabela = new Tabela(nazwaTabeli, numerTabeli, data);
NodeList rates = (NodeList) xpath.evaluate("//Rate", doc, XPathConstants.NODESET);
final int n = rates.getLength();
for (int i = 0; i < n; i++) {
Node rate = rates.item(i);
String kod = xpath.evaluate("Code", rate);
String nazwa = xpath.evaluate("Currency", rate);
String kurs = xpath.evaluate("Mid", rate);
BigDecimal kursBD = new BigDecimal(kurs);
Waluta waluta = new Waluta(kod, nazwa, kursBD);
tabela.dodaj(waluta);
}
return tabela;
} catch (XPathExpressionException e) {
e.printStackTrace();
return null;
}
}
}
\ No newline at end of file
package waluty.wersja_xml;
import java.math.BigDecimal;
import java.util.Scanner;
public class PrzelicznikWalutKonsola {
public static void main(String[] args) {
System.out.println("Pobieram aktualne kursy...");
Tabela tabela = ObslugaNBP.pobierzBiezaceKursy();
System.out.println(tabela);
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("\nPodaj kod waluty");
String kod = sc.nextLine().trim().toUpperCase();
if(kod == null || kod.isEmpty())
break;
Waluta waluta = tabela.znajdz(kod);
if(waluta == null) {
System.out.println("Nie ma takiej waluty.");
continue;
}
System.out.println("Wybrana waluta: " + waluta.getNazwa());
System.out.println("Podaj kwotę");
if(!sc.hasNextBigDecimal()) {
System.out.println("Nieprawidłowa kwota.");
continue;
}
BigDecimal kwota = sc.nextBigDecimal();
sc.nextLine();
System.out.println(kwota + " " + kod + " = "
+ waluta.przeliczNaZlote(kwota) + " PLN");
System.out.println(kwota + " PLN " + " = "
+ waluta.przeliczNaWalute(kwota) + " " + kod);
}
}
}
package waluty.wersja_xml;
import java.time.LocalDate;
import java.util.Collection;
import java.util.Map;
import java.util.TreeMap;
public class Tabela {
private final String nazwaTabeli;
private final String numerTabeli;
private final LocalDate data;
private final Map<String, Waluta> waluty = new TreeMap<>();
public Tabela() {
nazwaTabeli = null;
numerTabeli = null;
data = null;
}
public Tabela(String nazwaTabeli, String numerTabeli, LocalDate data) {
this.nazwaTabeli = nazwaTabeli;
this.numerTabeli = numerTabeli;
this.data = data;
}
public String getNazwaTabeli() {
return nazwaTabeli;
}
public String getNumerTabeli() {
return numerTabeli;
}
public LocalDate getData() {
return data;
}
@Override
public String toString() {
return "Tabela " + nazwaTabeli + " nr " + numerTabeli
+ " z dnia " + data + " (" + waluty.size() + " walut)";
}
public void dodaj(Waluta waluta) {
waluty.put(waluta.getKod(), waluta);
}
public Waluta znajdz(String kod) {
return waluty.get(kod);
}
public Collection<Waluta> getWszystkieWaluty() {
return waluty.values();
}
private static final String[] PUSTA_TABLICA = new String[0];
public String[] getKodyWalut() {
return waluty.keySet().toArray(PUSTA_TABLICA);
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((data == null) ? 0 : data.hashCode());
result = prime * result + ((nazwaTabeli == null) ? 0 : nazwaTabeli.hashCode());
result = prime * result + ((numerTabeli == null) ? 0 : numerTabeli.hashCode());
result = prime * result + ((waluty == null) ? 0 : waluty.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if(this == obj)
return true;
if(obj == null)
return false;
if(getClass() != obj.getClass())
return false;
Tabela other = (Tabela) obj;
if(data == null) {
if(other.data != null)
return false;
} else if(!data.equals(other.data))
return false;
if(nazwaTabeli == null) {
if(other.nazwaTabeli != null)
return false;
} else if(!nazwaTabeli.equals(other.nazwaTabeli))
return false;
if(numerTabeli == null) {
if(other.numerTabeli != null)
return false;
} else if(!numerTabeli.equals(other.numerTabeli))
return false;
if(waluty == null) {
if(other.waluty != null)
return false;
} else if(!waluty.equals(other.waluty))
return false;
return true;
}
}
package waluty.wersja_xml;
import java.util.Scanner;
public class WypiszKursyHistoryczne {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Podaj datę: ");
String data = sc.nextLine();
System.out.println("Pobieram...");
Tabela tabela = ObslugaNBP.pobierzKursyHistoryczne(data);
System.out.println("Pobrana tabela: " + tabela);
for (Waluta waluta : tabela.getWszystkieWaluty()) {
System.out.println(waluta);
}
}
}
package waluty.wersja_xml;
import java.util.Collection;
public class WypiszWszystkieWaluty {
public static void main(String[] args) {
Tabela tabela = ObslugaNBP.pobierzBiezaceKursy();
System.out.println("Pobrana tabela: " + tabela);
Collection<Waluta> waluty = tabela.getWszystkieWaluty();
for (Waluta waluta : waluty) {
System.out.println(waluta);
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment