From 87ce0d8b8c3a6fff82855246d5b6ad514870868b Mon Sep 17 00:00:00 2001 From: Dennis Eisold <de@itstall.de> Date: Thu, 21 Nov 2019 15:23:32 +0100 Subject: [PATCH] Client/Server Test --- .../java/de/telefonbuch/model/Client.java | 74 ++++ .../java/de/telefonbuch/model/Datenbank.java | 317 +++--------------- .../java/de/telefonbuch/model/IServer.java | 21 ++ .../java/de/telefonbuch/model/Server.java | 74 ++++ .../java/de/telefonbuch/model/Sqlite.java | 307 +++++++++++++++++ src/main/java/module-info.java | 10 - 6 files changed, 516 insertions(+), 287 deletions(-) create mode 100644 src/main/java/de/telefonbuch/model/Client.java create mode 100644 src/main/java/de/telefonbuch/model/IServer.java create mode 100644 src/main/java/de/telefonbuch/model/Server.java create mode 100644 src/main/java/de/telefonbuch/model/Sqlite.java delete mode 100644 src/main/java/module-info.java diff --git a/src/main/java/de/telefonbuch/model/Client.java b/src/main/java/de/telefonbuch/model/Client.java new file mode 100644 index 0000000..d23c5d8 --- /dev/null +++ b/src/main/java/de/telefonbuch/model/Client.java @@ -0,0 +1,74 @@ +package de.telefonbuch.model; + +import org.jetbrains.annotations.NotNull; + +import java.rmi.NotBoundException; +import java.rmi.RemoteException; +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; + +public class Client { + + IServer server; + + public Client(String ipaddress) throws RemoteException, NotBoundException { + // Registry holen, wenn sie sich auf demselben Rechner befindet + Registry registry = LocateRegistry.getRegistry(Registry.REGISTRY_PORT); + + // Entferntes Objekt laden + this.server = (IServer) registry.lookup("RMI-Server"); + + } + + public void addKontakt(@NotNull Kontakt kontakt) { + try { + server.addKontakt(kontakt); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + + public void deleteKontakt(String telefon) { + try { + server.deleteKontakt(telefon); + } catch (RemoteException e) { + e.printStackTrace(); + } + } + + public Kontakt getKontakt(@NotNull String telefon) { + Kontakt kontakt = null; + + try { + kontakt = server.getKontakt(telefon); + } catch (RemoteException e) { + e.printStackTrace(); + } + + return kontakt; + } + + public String[] getNavi(String telefon) { + String[] result = new String[0]; + + try { + result = server.getNavi(telefon); + } catch (RemoteException e) { + e.printStackTrace(); + } + + return result; + } + + public int countKontakte() { + int i = 0; + + try { + i = server.countKontakte(); + } catch (RemoteException e) { + e.printStackTrace(); + } + + return i; + } +} diff --git a/src/main/java/de/telefonbuch/model/Datenbank.java b/src/main/java/de/telefonbuch/model/Datenbank.java index 9e9d3d6..01bd07d 100644 --- a/src/main/java/de/telefonbuch/model/Datenbank.java +++ b/src/main/java/de/telefonbuch/model/Datenbank.java @@ -1,309 +1,72 @@ package de.telefonbuch.model; import org.jetbrains.annotations.NotNull; -import java.sql.*; -public class Datenbank { - private final String VIEW_KONTAKTE = "telefonbuch"; - private final String TABLE_KONTAKTE = "table_kontakte"; +import java.rmi.NotBoundException; +import java.rmi.RemoteException; - private Connection con; +public class Datenbank { + private final boolean CLIENT = false; + private Sqlite sqlite; + private Server server; + private Client client; + private final String IPADRESS = "127.0.0.1"; public Datenbank() { - new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 3); - try { - this.connect(); - this.createTables(); - } catch (SQLException e) { - e.printStackTrace(); + if(CLIENT) { + try { + this.client = new Client(IPADRESS); + } catch(RemoteException | NotBoundException e) { + e.printStackTrace(); + } + } else { + this.sqlite = new Sqlite(); + // Neues Serverobjekt erstellen + Server server = new Server(sqlite); + server.start(server); } - } - - private void createTables() throws SQLException { - new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 1); - - Statement stmt = this.con.createStatement(); - String sql; - - sql = "CREATE TABLE IF NOT EXISTS \"table_vorname\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, vorname VARCHAR(50) NOT NULL UNIQUE);"; - stmt.execute(sql); - sql = "CREATE TABLE IF NOT EXISTS \"table_nachname\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, nachname VARCHAR(50) NOT NULL UNIQUE);"; - stmt.execute(sql); - sql = "CREATE TABLE IF NOT EXISTS \"table_strasse\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, strasse VARCHAR(50) NOT NULL UNIQUE);"; - stmt.execute(sql); - sql = "CREATE TABLE IF NOT EXISTS \"table_hnr\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, hnr VARCHAR(15) NOT NULL UNIQUE);"; - stmt.execute(sql); - sql = "CREATE TABLE IF NOT EXISTS \"table_plz\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, plz CHAR(5) NOT NULL UNIQUE);"; - stmt.execute(sql); - sql = "CREATE TABLE IF NOT EXISTS \"table_ort\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, ort VARCHAR(50) NOT NULL UNIQUE);"; - stmt.execute(sql); - sql ="CREATE TABLE IF NOT EXISTS \"table_telefonbuch\" ( " + - " id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + - " vorname_id INTEGER NOT NULL, " + - " nachname_id INTEGER NOT NULL, " + - " strasse_id INTEGER NOT NULL, " + - " hnr_id INTEGER NOT NULL, " + - " plz_id INTEGER NOT NULL, " + - " ort_id INTEGER NOT NULL, " + - " telefon VARCHAR(30) NOT NULL UNIQUE," + - " FOREIGN KEY (vorname_id) REFERENCES table_vorname(id), " + - " FOREIGN KEY (nachname_id) REFERENCES table_nachname(id), " + - " FOREIGN KEY (strasse_id) REFERENCES table_strasse(id), " + - " FOREIGN KEY (hnr_id) REFERENCES table_hnr(id), " + - " FOREIGN KEY (plz_id) REFERENCES table_plz(id), " + - " FOREIGN KEY (ort_id) REFERENCES table_ort(id)" + - " );"; - stmt.execute(sql); - - sql = "CREATE VIEW IF NOT EXISTS telefonbuch AS " + - " SELECT v.vorname AS vorname, " + - " n.nachname AS nachname, " + - " s.strasse AS strasse, " + - " h.hnr AS hnr, " + - " p.plz AS plz, " + - " o.ort AS ort, " + - " t.telefon AS telefon " + - " FROM table_telefonbuch t " + - " INNER JOIN table_vorname v ON t.vorname_id = v.id " + - " INNER JOIN table_nachname n ON t.nachname_id = n.id " + - " INNER JOIN table_strasse s ON t.strasse_id = s.id " + - " INNER JOIN table_hnr h ON t.hnr_id = h.id " + - " INNER JOIN table_plz p ON t.plz_id = p.id " + - " INNER JOIN table_ort o ON t.ort_id = o.id;"; - stmt.execute(sql); - - sql = "PRAGMA foreign_keys = ON;"; - stmt.execute(sql); - - sql = "CREATE TRIGGER IF NOT EXISTS Telefonbuch_INS INSTEAD OF INSERT ON telefonbuch FOR EACH ROW\n" + - " BEGIN\n" + - " INSERT INTO table_vorname (vorname) SELECT NEW.vorname WHERE NOT EXISTS (SELECT 1 FROM table_vorname WHERE vorname = NEW.vorname);\n" + - " INSERT INTO table_nachname (nachname) SELECT NEW.nachname WHERE NOT EXISTS (SELECT 1 FROM table_nachname WHERE nachname = NEW.nachname);\n" + - " INSERT INTO table_strasse (strasse) SELECT NEW.strasse WHERE NOT EXISTS (SELECT 1 FROM table_strasse WHERE strasse = NEW.strasse);\n" + - " INSERT INTO table_hnr (hnr) SELECT NEW.hnr WHERE NOT EXISTS (SELECT 1 FROM table_hnr WHERE hnr = NEW.hnr);\n" + - " INSERT INTO table_plz (plz) SELECT NEW.plz WHERE NOT EXISTS (SELECT 1 FROM table_plz WHERE plz = NEW.plz);\n" + - " INSERT INTO table_ort (ort) SELECT NEW.ort WHERE NOT EXISTS (SELECT 1 FROM table_ort WHERE ort = NEW.ort);\n" + - " INSERT INTO table_telefonbuch (vorname_id, nachname_id, strasse_id, hnr_id, plz_id, ort_id, telefon) SELECT (SELECT id FROM table_vorname WHERE vorname = NEW.vorname), (SELECT id FROM table_nachname WHERE nachname = NEW.nachname), (SELECT id FROM table_strasse WHERE strasse = NEW.strasse), (SELECT id FROM table_hnr WHERE hnr = NEW.hnr), (SELECT id FROM table_plz WHERE plz = NEW.plz), (SELECT id FROM table_ort WHERE ort = NEW.ort), NEW.telefon;\n" + - " END;"; - stmt.execute(sql); - - sql = "CREATE TRIGGER IF NOT EXISTS Telefonbuch_DEL INSTEAD OF DELETE ON telefonbuch FOR EACH ROW\n" + - " BEGIN\n" + - " DELETE FROM table_telefonbuch WHERE telefon = OLD.telefon;\n" + - " DELETE FROM table_vorname WHERE id NOT IN (SELECT vorname_id FROM table_telefonbuch);\n" + - " DELETE FROM table_nachname WHERE id NOT IN (SELECT nachname_id FROM table_telefonbuch);\n" + - " DELETE FROM table_strasse WHERE id NOT IN (SELECT strasse_id FROM table_telefonbuch);\n" + - " DELETE FROM table_hnr WHERE id NOT IN (SELECT hnr_id FROM table_telefonbuch);\n" + - " DELETE FROM table_plz WHERE id NOT IN (SELECT plz_id FROM table_telefonbuch);\n" + - " DELETE FROM table_ort WHERE id NOT IN (SELECT ort_id FROM table_telefonbuch);\n" + - " END;"; - stmt.execute(sql); - - sql = "CREATE TRIGGER IF NOT EXISTS Telefonbuch_UPD INSTEAD OF UPDATE ON telefonbuch FOR EACH ROW\n" + - " BEGIN\n" + - " INSERT INTO table_vorname (vorname) SELECT NEW.vorname WHERE NOT EXISTS (SELECT 1 FROM table_vorname WHERE vorname = NEW.vorname);\n" + - " INSERT INTO table_nachname (nachname) SELECT NEW.nachname WHERE NOT EXISTS (SELECT 1 FROM table_nachname WHERE nachname = NEW.nachname);\n" + - " INSERT INTO table_strasse (strasse) SELECT NEW.strasse WHERE NOT EXISTS (SELECT 1 FROM table_strasse WHERE strasse = NEW.strasse);\n" + - " INSERT INTO table_hnr (hnr) SELECT NEW.hnr WHERE NOT EXISTS (SELECT 1 FROM table_hnr WHERE hnr = NEW.hnr);\n" + - " INSERT INTO table_plz (plz) SELECT NEW.plz WHERE NOT EXISTS (SELECT 1 FROM table_plz WHERE plz = NEW.plz);\n" + - " INSERT INTO table_ort (ort) SELECT NEW.ort WHERE NOT EXISTS (SELECT 1 FROM table_ort WHERE ort = NEW.ort);\n" + - " UPDATE table_telefonbuch SET vorname_id = (SELECT id FROM table_vorname WHERE vorname = NEW.vorname), nachname_id = (SELECT id FROM table_nachname WHERE nachname = NEW.nachname), strasse_id = (SELECT id FROM table_strasse WHERE strasse = NEW.strasse), hnr_id = (SELECT id FROM table_hnr WHERE hnr = NEW.hnr), plz_id = (SELECT id FROM table_plz WHERE plz = NEW.plz), ort_id = (SELECT id FROM table_ort WHERE ort = NEW.ort), telefon = NEW.telefon WHERE telefon = OLD.telefon;\n" + - " DELETE FROM table_vorname WHERE id NOT IN (SELECT vorname_id FROM table_telefonbuch);\n" + - " DELETE FROM table_nachname WHERE id NOT IN (SELECT nachname_id FROM table_telefonbuch);\n" + - " DELETE FROM table_strasse WHERE id NOT IN (SELECT strasse_id FROM table_telefonbuch);\n" + - " DELETE FROM table_hnr WHERE id NOT IN (SELECT hnr_id FROM table_telefonbuch);\n" + - " DELETE FROM table_plz WHERE id NOT IN (SELECT plz_id FROM table_telefonbuch);\n" + - " DELETE FROM table_ort WHERE id NOT IN (SELECT ort_id FROM table_telefonbuch);\n" + - " END;"; - stmt.execute(sql); - } - /** - * Verbindung zur Datenbank aufbauen - */ - private void connect() throws SQLException { - new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 1); - - String datenbankdatei = "c:\\temp\\telefonbuch.sqlite"; - - this.con = DriverManager.getConnection("jdbc:sqlite:" + datenbankdatei); + new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 3); } public void addKontakt(@NotNull Kontakt kontakt) { - - new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 1); - - try { - Statement stmt = this.con.createStatement(); - - String checkKontakt = "SELECT telefon FROM " + VIEW_KONTAKTE + " WHERE telefon=\"" + kontakt.getId() + "\";"; - ResultSet checkResult = stmt.executeQuery(checkKontakt); - - int rows = 0; - while (checkResult.next()) { - rows++; - } - - String insertKontakt; - - if (rows == 1) { - new Fehler().debug("Updating contact", false); - - insertKontakt = "UPDATE " + VIEW_KONTAKTE + " SET " + - "vorname=\"" + kontakt.getVorname() + "\", " + - "nachname=\"" + kontakt.getNachname() + "\", " + - "strasse=\"" + kontakt.getStrasse() + "\", " + - "hnr=\"" + kontakt.getHausnummer() + "\", " + - "plz=\"" + kontakt.getPlz() + "\", " + - "ort=\"" + kontakt.getOrt() + "\", " + - "telefon=\"" + kontakt.getTelefon() + "\" " + - " WHERE telefon=\"" + kontakt.getId() + "\";"; - } else { - new Fehler().debug("Insert new contact", false); - - insertKontakt = "INSERT INTO " + VIEW_KONTAKTE + " (vorname, nachname, strasse, hnr, plz, ort, telefon) VALUES (" + - "\"" + kontakt.getVorname() + "\", " + - "\"" + kontakt.getNachname() + "\", " + - "\"" + kontakt.getStrasse() + "\", " + - "\"" + kontakt.getHausnummer() + "\", " + - "\"" + kontakt.getPlz() + "\", " + - "\"" + kontakt.getOrt() + "\", " + - "\"" + kontakt.getTelefon() + "\" " + - ");"; - } - new Fehler().debug(insertKontakt, false); - - stmt.execute(insertKontakt); - } catch (SQLException e) { - e.printStackTrace(); + if(CLIENT) { + this.client.addKontakt(kontakt); + } else { + this.sqlite.addKontakt(kontakt); } } public void deleteKontakt(String telefon) { - new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 2); - - try { - Statement stmt = this.con.createStatement(); - - String sql = " DELETE FROM " + VIEW_KONTAKTE + "" + - " WHERE telefon=\"" + telefon + "\";"; - stmt.execute(sql); - - } catch (SQLException e) { - e.printStackTrace(); + if(CLIENT) { + this.client.deleteKontakt(telefon); + } else { + this.sqlite.deleteKontakt(telefon); } } public Kontakt getKontakt(@NotNull String telefon) { - new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 3); - - Kontakt kontakt = new Kontakt(); - String sql; - - try { - Statement stmt = this.con.createStatement(); - - if (telefon.equals("first")) { - sql = "SELECT * " + - "FROM " + VIEW_KONTAKTE + " " + - "LIMIT 1;"; - } else { - sql = "SELECT * " + - "FROM " + VIEW_KONTAKTE + " " + - "WHERE telefon=\"" + telefon + "\";"; - } - ResultSet rs = stmt.executeQuery(sql); - - while (rs.next()) { - if (rs.getString("telefon").equals(telefon) || telefon.equals("first")) { - kontakt.setId(rs.getString("telefon")); - kontakt.setVorname(rs.getString("vorname")); - kontakt.setNachname(rs.getString("nachname")); - kontakt.setStrasse(rs.getString("strasse")); - kontakt.setHausnummer(rs.getString("hnr")); - kontakt.setPlz(rs.getString("plz")); - kontakt.setOrt(rs.getString("ort")); - kontakt.setTelefon(rs.getString("telefon")); - - if (telefon.equals("first")) { - break; - } - } - } - } catch (SQLException e) { - e.printStackTrace(); + if(CLIENT) { + return this.client.getKontakt(telefon); + } else { + return this.sqlite.getKontakt(telefon); } - - return kontakt; } public String[] getNavi(String telefon) { - new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 3); - - String[] naviResult = new String[3]; - - try { - Statement stmt = this.con.createStatement(); - String sql = "SELECT " + - " CASE " + - " WHEN LAG(telefon) OVER (ORDER BY nachname) IS NULL THEN ( " + - " SELECT telefon " + - " FROM " + VIEW_KONTAKTE + " " + - " ORDER BY nachname DESC " + - " LIMIT 1 " + - " ) " + - " ELSE LAG(telefon) OVER (ORDER BY nachname) " + - " END last, " + - " telefon AS current, " + - " CASE " + - " WHEN LEAD(telefon) OVER (ORDER BY nachname) IS NULL THEN ( " + - " SELECT telefon " + - " FROM " + VIEW_KONTAKTE + " " + - " ORDER BY nachname ASC " + - " LIMIT 1 " + - " ) " + - " ELSE LEAD(telefon) OVER (ORDER BY nachname) " + - " END next " + - "FROM " + VIEW_KONTAKTE + " " + - "ORDER BY nachname ASC;"; - - ResultSet rs = stmt.executeQuery(sql); - - while (rs.next()) { - if (rs.getString("current").equals(telefon)) { - naviResult[0] = rs.getString("last"); - naviResult[1] = rs.getString("current"); - naviResult[2] = rs.getString("next"); - } - } - } catch (SQLException e) { - e.printStackTrace(); + if(CLIENT) { + return this.client.getNavi(telefon); + } else { + return this.sqlite.getNavi(telefon); } - - return naviResult; } public int countKontakte() { - new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 2); - - int intResult = 0; - - try { - Statement stmt = this.con.createStatement(); - - String sql = " SELECT COUNT(*) AS count" + - " FROM " + VIEW_KONTAKTE + ";"; - ResultSet rs = stmt.executeQuery(sql); - - intResult = rs.getInt("count"); - - } catch (SQLException e) { - e.printStackTrace(); + if(CLIENT) { + return this.client.countKontakte(); + } else { + return this.sqlite.countKontakte(); } - - new Fehler().debug("Result: " + intResult, false); - - return intResult; } } diff --git a/src/main/java/de/telefonbuch/model/IServer.java b/src/main/java/de/telefonbuch/model/IServer.java new file mode 100644 index 0000000..055bca3 --- /dev/null +++ b/src/main/java/de/telefonbuch/model/IServer.java @@ -0,0 +1,21 @@ +package de.telefonbuch.model; + +import org.jetbrains.annotations.NotNull; + +import java.rmi.Remote; +import java.rmi.RemoteException; + +public interface IServer extends Remote { + + void methodenaufruf() throws RemoteException; + String methodeMitRueckgabe() throws RemoteException; + void methodeMitParameter(String text) throws RemoteException; + boolean interaktion(String text) throws RemoteException; + + void addKontakt(Kontakt kontakt) throws RemoteException; + void deleteKontakt(String telefon) throws RemoteException; + Kontakt getKontakt(String telefon) throws RemoteException; + String[] getNavi(String telefon) throws RemoteException; + int countKontakte() throws RemoteException; + +} diff --git a/src/main/java/de/telefonbuch/model/Server.java b/src/main/java/de/telefonbuch/model/Server.java new file mode 100644 index 0000000..f37139f --- /dev/null +++ b/src/main/java/de/telefonbuch/model/Server.java @@ -0,0 +1,74 @@ +package de.telefonbuch.model; + +import org.jetbrains.annotations.NotNull; + +import java.rmi.RemoteException; +import java.rmi.registry.LocateRegistry; +import java.rmi.registry.Registry; +import java.rmi.server.UnicastRemoteObject; + +public class Server implements IServer { + + public Sqlite sqlite; + + public Server(Sqlite sqlite) { + this.sqlite = sqlite; + } + + public void start(Server server) { + try { + // Neues Objekt erstellen, das zur Registry exportiert werden soll + IServer stub = (IServer) UnicastRemoteObject.exportObject(server, 0); + + // Das exportierte Objekt an die Registry binden + // Standard-Port der Registry: 1099 + Registry registry = LocateRegistry.createRegistry(Registry.REGISTRY_PORT); + registry.rebind("RMI-Server", stub); // rebind überschreibt ein evtl schon gebundenes Objekt + } catch (RemoteException e) { + e.printStackTrace(); + } + } + + public void addKontakt(@NotNull Kontakt kontakt) { + sqlite.addKontakt(kontakt); + } + + public void deleteKontakt(String telefon) { + sqlite.deleteKontakt(telefon); + } + + public Kontakt getKontakt(@NotNull String telefon) { + return sqlite.getKontakt(telefon); + } + + public String[] getNavi(String telefon) { + return sqlite.getNavi(telefon); + } + + public int countKontakte() { + return sqlite.countKontakte(); + } + + @Override + public void methodenaufruf() throws RemoteException { + System.out.println("Aufruf von Methode 'methodenaufruf()'"); + } + + @Override + public String methodeMitRueckgabe() throws RemoteException { + System.out.println("Aufruf von Methode 'methodeMitRueckgabe()'"); + return "Hallo Client!"; + } + + @Override + public void methodeMitParameter(String text) throws RemoteException { + System.out.println("Aufruf von Methode 'methodeMitParameter()' mit Parameter: " + text); + } + + @Override + public boolean interaktion(String text) throws RemoteException { + System.out.println("Aufruf von Methode 'interaktion()' mit Parameter: " + text); + return true; + } + +} \ No newline at end of file diff --git a/src/main/java/de/telefonbuch/model/Sqlite.java b/src/main/java/de/telefonbuch/model/Sqlite.java new file mode 100644 index 0000000..49828e9 --- /dev/null +++ b/src/main/java/de/telefonbuch/model/Sqlite.java @@ -0,0 +1,307 @@ +package de.telefonbuch.model; + +import org.jetbrains.annotations.NotNull; + +import java.sql.*; + +public class Sqlite { + + private final String VIEW_KONTAKTE = "telefonbuch"; + private Connection con; + + public Sqlite() { + try { + this.connect(); + this.createTables(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + private void createTables() throws SQLException { + new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 1); + + Statement stmt = this.con.createStatement(); + String sql; + + sql = "CREATE TABLE IF NOT EXISTS \"table_vorname\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, vorname VARCHAR(50) NOT NULL UNIQUE);"; + stmt.execute(sql); + sql = "CREATE TABLE IF NOT EXISTS \"table_nachname\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, nachname VARCHAR(50) NOT NULL UNIQUE);"; + stmt.execute(sql); + sql = "CREATE TABLE IF NOT EXISTS \"table_strasse\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, strasse VARCHAR(50) NOT NULL UNIQUE);"; + stmt.execute(sql); + sql = "CREATE TABLE IF NOT EXISTS \"table_hnr\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, hnr VARCHAR(15) NOT NULL UNIQUE);"; + stmt.execute(sql); + sql = "CREATE TABLE IF NOT EXISTS \"table_plz\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, plz CHAR(5) NOT NULL UNIQUE);"; + stmt.execute(sql); + sql = "CREATE TABLE IF NOT EXISTS \"table_ort\" (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, ort VARCHAR(50) NOT NULL UNIQUE);"; + stmt.execute(sql); + sql ="CREATE TABLE IF NOT EXISTS \"table_telefonbuch\" ( " + + " id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, " + + " vorname_id INTEGER NOT NULL, " + + " nachname_id INTEGER NOT NULL, " + + " strasse_id INTEGER NOT NULL, " + + " hnr_id INTEGER NOT NULL, " + + " plz_id INTEGER NOT NULL, " + + " ort_id INTEGER NOT NULL, " + + " telefon VARCHAR(30) NOT NULL UNIQUE," + + " FOREIGN KEY (vorname_id) REFERENCES table_vorname(id), " + + " FOREIGN KEY (nachname_id) REFERENCES table_nachname(id), " + + " FOREIGN KEY (strasse_id) REFERENCES table_strasse(id), " + + " FOREIGN KEY (hnr_id) REFERENCES table_hnr(id), " + + " FOREIGN KEY (plz_id) REFERENCES table_plz(id), " + + " FOREIGN KEY (ort_id) REFERENCES table_ort(id)" + + " );"; + stmt.execute(sql); + + sql = "CREATE VIEW IF NOT EXISTS telefonbuch AS " + + " SELECT v.vorname AS vorname, " + + " n.nachname AS nachname, " + + " s.strasse AS strasse, " + + " h.hnr AS hnr, " + + " p.plz AS plz, " + + " o.ort AS ort, " + + " t.telefon AS telefon " + + " FROM table_telefonbuch t " + + " INNER JOIN table_vorname v ON t.vorname_id = v.id " + + " INNER JOIN table_nachname n ON t.nachname_id = n.id " + + " INNER JOIN table_strasse s ON t.strasse_id = s.id " + + " INNER JOIN table_hnr h ON t.hnr_id = h.id " + + " INNER JOIN table_plz p ON t.plz_id = p.id " + + " INNER JOIN table_ort o ON t.ort_id = o.id;"; + stmt.execute(sql); + + sql = "PRAGMA foreign_keys = ON;"; + stmt.execute(sql); + + sql = "CREATE TRIGGER IF NOT EXISTS Telefonbuch_INS INSTEAD OF INSERT ON telefonbuch FOR EACH ROW\n" + + " BEGIN\n" + + " INSERT INTO table_vorname (vorname) SELECT NEW.vorname WHERE NOT EXISTS (SELECT 1 FROM table_vorname WHERE vorname = NEW.vorname);\n" + + " INSERT INTO table_nachname (nachname) SELECT NEW.nachname WHERE NOT EXISTS (SELECT 1 FROM table_nachname WHERE nachname = NEW.nachname);\n" + + " INSERT INTO table_strasse (strasse) SELECT NEW.strasse WHERE NOT EXISTS (SELECT 1 FROM table_strasse WHERE strasse = NEW.strasse);\n" + + " INSERT INTO table_hnr (hnr) SELECT NEW.hnr WHERE NOT EXISTS (SELECT 1 FROM table_hnr WHERE hnr = NEW.hnr);\n" + + " INSERT INTO table_plz (plz) SELECT NEW.plz WHERE NOT EXISTS (SELECT 1 FROM table_plz WHERE plz = NEW.plz);\n" + + " INSERT INTO table_ort (ort) SELECT NEW.ort WHERE NOT EXISTS (SELECT 1 FROM table_ort WHERE ort = NEW.ort);\n" + + " INSERT INTO table_telefonbuch (vorname_id, nachname_id, strasse_id, hnr_id, plz_id, ort_id, telefon) SELECT (SELECT id FROM table_vorname WHERE vorname = NEW.vorname), (SELECT id FROM table_nachname WHERE nachname = NEW.nachname), (SELECT id FROM table_strasse WHERE strasse = NEW.strasse), (SELECT id FROM table_hnr WHERE hnr = NEW.hnr), (SELECT id FROM table_plz WHERE plz = NEW.plz), (SELECT id FROM table_ort WHERE ort = NEW.ort), NEW.telefon;\n" + + " END;"; + stmt.execute(sql); + + sql = "CREATE TRIGGER IF NOT EXISTS Telefonbuch_DEL INSTEAD OF DELETE ON telefonbuch FOR EACH ROW\n" + + " BEGIN\n" + + " DELETE FROM table_telefonbuch WHERE telefon = OLD.telefon;\n" + + " DELETE FROM table_vorname WHERE id NOT IN (SELECT vorname_id FROM table_telefonbuch);\n" + + " DELETE FROM table_nachname WHERE id NOT IN (SELECT nachname_id FROM table_telefonbuch);\n" + + " DELETE FROM table_strasse WHERE id NOT IN (SELECT strasse_id FROM table_telefonbuch);\n" + + " DELETE FROM table_hnr WHERE id NOT IN (SELECT hnr_id FROM table_telefonbuch);\n" + + " DELETE FROM table_plz WHERE id NOT IN (SELECT plz_id FROM table_telefonbuch);\n" + + " DELETE FROM table_ort WHERE id NOT IN (SELECT ort_id FROM table_telefonbuch);\n" + + " END;"; + stmt.execute(sql); + + sql = "CREATE TRIGGER IF NOT EXISTS Telefonbuch_UPD INSTEAD OF UPDATE ON telefonbuch FOR EACH ROW\n" + + " BEGIN\n" + + " INSERT INTO table_vorname (vorname) SELECT NEW.vorname WHERE NOT EXISTS (SELECT 1 FROM table_vorname WHERE vorname = NEW.vorname);\n" + + " INSERT INTO table_nachname (nachname) SELECT NEW.nachname WHERE NOT EXISTS (SELECT 1 FROM table_nachname WHERE nachname = NEW.nachname);\n" + + " INSERT INTO table_strasse (strasse) SELECT NEW.strasse WHERE NOT EXISTS (SELECT 1 FROM table_strasse WHERE strasse = NEW.strasse);\n" + + " INSERT INTO table_hnr (hnr) SELECT NEW.hnr WHERE NOT EXISTS (SELECT 1 FROM table_hnr WHERE hnr = NEW.hnr);\n" + + " INSERT INTO table_plz (plz) SELECT NEW.plz WHERE NOT EXISTS (SELECT 1 FROM table_plz WHERE plz = NEW.plz);\n" + + " INSERT INTO table_ort (ort) SELECT NEW.ort WHERE NOT EXISTS (SELECT 1 FROM table_ort WHERE ort = NEW.ort);\n" + + " UPDATE table_telefonbuch SET vorname_id = (SELECT id FROM table_vorname WHERE vorname = NEW.vorname), nachname_id = (SELECT id FROM table_nachname WHERE nachname = NEW.nachname), strasse_id = (SELECT id FROM table_strasse WHERE strasse = NEW.strasse), hnr_id = (SELECT id FROM table_hnr WHERE hnr = NEW.hnr), plz_id = (SELECT id FROM table_plz WHERE plz = NEW.plz), ort_id = (SELECT id FROM table_ort WHERE ort = NEW.ort), telefon = NEW.telefon WHERE telefon = OLD.telefon;\n" + + " DELETE FROM table_vorname WHERE id NOT IN (SELECT vorname_id FROM table_telefonbuch);\n" + + " DELETE FROM table_nachname WHERE id NOT IN (SELECT nachname_id FROM table_telefonbuch);\n" + + " DELETE FROM table_strasse WHERE id NOT IN (SELECT strasse_id FROM table_telefonbuch);\n" + + " DELETE FROM table_hnr WHERE id NOT IN (SELECT hnr_id FROM table_telefonbuch);\n" + + " DELETE FROM table_plz WHERE id NOT IN (SELECT plz_id FROM table_telefonbuch);\n" + + " DELETE FROM table_ort WHERE id NOT IN (SELECT ort_id FROM table_telefonbuch);\n" + + " END;"; + stmt.execute(sql); + } + + /** + * Verbindung zur Datenbank aufbauen + */ + private void connect() throws SQLException { + new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 1); + + String datenbankdatei = "c:\\temp\\telefonbuch.sqlite"; + + this.con = DriverManager.getConnection("jdbc:sqlite:" + datenbankdatei); + } + + public void addKontakt(@NotNull Kontakt kontakt) { + + new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 1); + + try { + Statement stmt = this.con.createStatement(); + + String checkKontakt = "SELECT telefon FROM " + VIEW_KONTAKTE + " WHERE telefon=\"" + kontakt.getId() + "\";"; + ResultSet checkResult = stmt.executeQuery(checkKontakt); + + int rows = 0; + while (checkResult.next()) { + rows++; + } + + String insertKontakt; + + if (rows == 1) { + new Fehler().debug("Updating contact", false); + + insertKontakt = "UPDATE " + VIEW_KONTAKTE + " SET " + + "vorname=\"" + kontakt.getVorname() + "\", " + + "nachname=\"" + kontakt.getNachname() + "\", " + + "strasse=\"" + kontakt.getStrasse() + "\", " + + "hnr=\"" + kontakt.getHausnummer() + "\", " + + "plz=\"" + kontakt.getPlz() + "\", " + + "ort=\"" + kontakt.getOrt() + "\", " + + "telefon=\"" + kontakt.getTelefon() + "\" " + + " WHERE telefon=\"" + kontakt.getId() + "\";"; + } else { + new Fehler().debug("Insert new contact", false); + + insertKontakt = "INSERT INTO " + VIEW_KONTAKTE + " (vorname, nachname, strasse, hnr, plz, ort, telefon) VALUES (" + + "\"" + kontakt.getVorname() + "\", " + + "\"" + kontakt.getNachname() + "\", " + + "\"" + kontakt.getStrasse() + "\", " + + "\"" + kontakt.getHausnummer() + "\", " + + "\"" + kontakt.getPlz() + "\", " + + "\"" + kontakt.getOrt() + "\", " + + "\"" + kontakt.getTelefon() + "\" " + + ");"; + } + new Fehler().debug(insertKontakt, false); + + stmt.execute(insertKontakt); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public void deleteKontakt(String telefon) { + new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 2); + + try { + Statement stmt = this.con.createStatement(); + + String sql = " DELETE FROM " + VIEW_KONTAKTE + "" + + " WHERE telefon=\"" + telefon + "\";"; + stmt.execute(sql); + + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public Kontakt getKontakt(@NotNull String telefon) { + new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 3); + + Kontakt kontakt = new Kontakt(); + String sql; + + try { + Statement stmt = this.con.createStatement(); + + if (telefon.equals("first")) { + sql = "SELECT * " + + "FROM " + VIEW_KONTAKTE + " " + + "LIMIT 1;"; + } else { + sql = "SELECT * " + + "FROM " + VIEW_KONTAKTE + " " + + "WHERE telefon=\"" + telefon + "\";"; + } + ResultSet rs = stmt.executeQuery(sql); + + while (rs.next()) { + if (rs.getString("telefon").equals(telefon) || telefon.equals("first")) { + kontakt.setId(rs.getString("telefon")); + kontakt.setVorname(rs.getString("vorname")); + kontakt.setNachname(rs.getString("nachname")); + kontakt.setStrasse(rs.getString("strasse")); + kontakt.setHausnummer(rs.getString("hnr")); + kontakt.setPlz(rs.getString("plz")); + kontakt.setOrt(rs.getString("ort")); + kontakt.setTelefon(rs.getString("telefon")); + + if (telefon.equals("first")) { + break; + } + } + } + } catch (SQLException e) { + e.printStackTrace(); + } + + return kontakt; + } + + public String[] getNavi(String telefon) { + new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 3); + + String[] naviResult = new String[3]; + + try { + Statement stmt = this.con.createStatement(); + String sql = "SELECT " + + " CASE " + + " WHEN LAG(telefon) OVER (ORDER BY nachname) IS NULL THEN ( " + + " SELECT telefon " + + " FROM " + VIEW_KONTAKTE + " " + + " ORDER BY nachname DESC " + + " LIMIT 1 " + + " ) " + + " ELSE LAG(telefon) OVER (ORDER BY nachname) " + + " END last, " + + " telefon AS current, " + + " CASE " + + " WHEN LEAD(telefon) OVER (ORDER BY nachname) IS NULL THEN ( " + + " SELECT telefon " + + " FROM " + VIEW_KONTAKTE + " " + + " ORDER BY nachname ASC " + + " LIMIT 1 " + + " ) " + + " ELSE LEAD(telefon) OVER (ORDER BY nachname) " + + " END next " + + "FROM " + VIEW_KONTAKTE + " " + + "ORDER BY nachname ASC;"; + + ResultSet rs = stmt.executeQuery(sql); + + while (rs.next()) { + if (rs.getString("current").equals(telefon)) { + naviResult[0] = rs.getString("last"); + naviResult[1] = rs.getString("current"); + naviResult[2] = rs.getString("next"); + } + } + } catch (SQLException e) { + e.printStackTrace(); + } + + return naviResult; + } + + public int countKontakte() { + new Fehler().debug(this.getClass().getName() + "." + new Throwable().getStackTrace()[0].getMethodName(), true, 2); + + int intResult = 0; + + try { + Statement stmt = this.con.createStatement(); + + String sql = " SELECT COUNT(*) AS count" + + " FROM " + VIEW_KONTAKTE + ";"; + ResultSet rs = stmt.executeQuery(sql); + + intResult = rs.getInt("count"); + + } catch (SQLException e) { + e.printStackTrace(); + } + + new Fehler().debug("Result: " + intResult, false); + + return intResult; + } +} diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java deleted file mode 100644 index 7376dd0..0000000 --- a/src/main/java/module-info.java +++ /dev/null @@ -1,10 +0,0 @@ -module de.telefonbuch { - requires javafx.controls; - requires javafx.fxml; - requires java.desktop; - requires java.sql; - requires org.jetbrains.annotations; - - opens de.telefonbuch to javafx.fxml; - exports de.telefonbuch; -} \ No newline at end of file -- GitLab