/** * DBController for Project HomeFlix * connection is in manual commit! * TODO arraylists not string -> streamUIData */ package application; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.ArrayList; import java.util.List; import com.eclipsesource.json.Json; import com.eclipsesource.json.JsonArray; import com.eclipsesource.json.JsonObject; import com.eclipsesource.json.JsonValue; public class DBController { public DBController(MainWindowController m) { mainWindowController = m; } private MainWindowController mainWindowController; private String DB_PATH = System.getProperty("user.home") + "\\Documents\\HomeFlix" + "\\" + "Homeflix.db"; // der Pfad der Datenbank-Datei private List filmsdbAll = new ArrayList(); private List filmsdbLocal = new ArrayList(); private List filmsdbStream = new ArrayList(); private List filmsdbStreamURL = new ArrayList(); private List filmsAll = new ArrayList(); private List filmsDir = new ArrayList(); private List filmsStream = new ArrayList(); private List filmsStreamURL = new ArrayList(); private List filmsStreamData = new ArrayList(); Connection connection = null; public void main() { try { // create a database connection connection = DriverManager.getConnection("jdbc:sqlite:" + DB_PATH); // Statement statement = connection.createStatement(); // statement.setQueryTimeout(30); // set timeout to 30 sec. TODO don't know wath to do with this connection.setAutoCommit(false); //Autocommit to false -> manual commit is active // fuelleDatenbank(); } catch (SQLException e) { // if the error message is "out of memory", it probably means no database file is found System.err.println(e.getMessage()); } // finally { // try { // if (connection != null) // connection.close(); // } catch (SQLException e) { // // connection close failed. // System.err.println(e); // } // } } void createDatabase() { System.out.println("<=====starting loading sql=====>"); PreparedStatement ps; PreparedStatement psS; try { Statement stmt = connection.createStatement(); stmt.executeUpdate("create table if not exists film_local (rating, titel, streamUrl)"); stmt.executeUpdate("create table if not exists film_streaming (year, season, episode, rating, resolution, titel, streamUrl)"); stmt.close(); } catch (SQLException e1) { e1.printStackTrace(); } try { Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM film_local"); while (rs.next()) { filmsdbLocal.add(rs.getString(2)); } stmt.close(); rs.close(); rs = stmt.executeQuery("SELECT * FROM film_streaming;"); while (rs.next()) { filmsdbStream.add(rs.getString(6)); filmsdbStreamURL.add(rs.getString(7)); } stmt.close(); rs.close(); }catch (SQLException ea){ System.err.println("Ups! an error occured!"); ea.printStackTrace(); } String[] entries = new File(mainWindowController.getPath()).list(); for(int i=0;i!=entries.length;i++){ filmsDir.add(cutOffEnd(entries[i])); } for(int v=0; v< mainWindowController.streamingData.size(); v++){ String fileName = mainWindowController.getStreamingPath()+"/"+mainWindowController.streamingData.get(v).getStreamUrl(); try { JsonObject object = Json.parse(new FileReader(fileName)).asObject(); JsonArray items = object.get("entries").asArray(); for (JsonValue item : items) { filmsStream.add(item.asObject().getString("titel","")); filmsStreamURL.add(item.asObject().getString("streamUrl","")); filmsStreamData.add(fileName); } } catch (IOException e) { e.printStackTrace(); } } filmsAll.addAll(filmsDir); filmsAll.addAll(filmsStream); filmsdbAll.addAll(filmsdbLocal); filmsdbAll.addAll(filmsdbStream); System.out.println("films in directory: "+filmsAll.size()); System.out.println("filme in db: "+filmsdbAll.size()); if(filmsdbAll.size() == 0){ System.out.println("creating entries ..."); try{ ps = connection.prepareStatement("insert into film_local values (?, ?, ?)"); psS = connection.prepareStatement("insert into film_streaming values (?, ?, ?, ?, ?, ?, ?)"); for(int j=0;j!=entries.length;j++) // Geht alle Dateien im Verzeichniss durch { ps.setInt(1, 0); // definiert Bewertung als Integer in der dritten Spalte ps.setString(2, cutOffEnd(entries[j])); // definiert Name als String in der ersten Spalte ps.setString(3,entries[j]); // definiert Pfad als String in der zweiten Spalte ps.addBatch(); // fügt den Eintrag hinzu } if(mainWindowController.getStreamingPath().equals("")||mainWindowController.getStreamingPath().equals(null)){ System.out.println("Kein Pfad angegeben"); //falls der Pfad null oder "" ist }else{ for(int i=0; i< mainWindowController.streamingData.size(); i++){ String fileNamea = mainWindowController.getStreamingPath()+"/"+mainWindowController.streamingData.get(i).getStreamUrl(); try { JsonObject object = Json.parse(new FileReader(fileNamea)).asObject(); JsonArray items = object.get("entries").asArray(); for (JsonValue item : items) { psS.setInt(1, item.asObject().getInt("year", 0)); psS.setInt(2, item.asObject().getInt("season", 0)); psS.setInt(3, item.asObject().getInt("episode", 0)); psS.setInt(4, 0); psS.setString(5, item.asObject().getString("resolution", "")); psS.setString(6, item.asObject().getString("titel","")); psS.setString(7, item.asObject().getString("streamUrl", "")); psS.addBatch(); // fügt den Eintrag hinzu } } catch (IOException e) { e.printStackTrace(); } } } ps.executeBatch(); // scheibt alle Einträge in die Datenbank psS.executeBatch(); connection.commit(); ps.close(); psS.close(); }catch (SQLException ea) { System.err.println("Konnte nicht ausgeführt werden"); ea.printStackTrace(); } }else { try { try { checkAddEntry(); } catch (IOException e) { e.printStackTrace(); } //check if added a new file checkRemoveEntry(); //check if removed a file } catch (SQLException e) { e.printStackTrace(); } } } //loading data from database to mainWindowController void loadData(){ System.out.println("loading data to mwc ..."); try { //load local Data Statement stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM film_local"); while (rs.next()) { mainWindowController.newDaten.add(new streamUiData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3))); } stmt.close(); rs.close(); //load streaming Data TODO check if there are streaming data before loading -> maybe there is an issue now rs = stmt.executeQuery("SELECT * FROM film_streaming;"); while (rs.next()) { mainWindowController.streamData.add(new streamUiData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7))); } stmt.close(); rs.close(); } catch (SQLException e) { System.err.println("Ups! an error occured!"); e.printStackTrace(); } System.out.println("<=====finished loading sql=====>"); } //refreshs the data in mainWindowController.newDaten and mainWindowController.streamData //TODO it seems that there is an issue at the moment with streaming refreshing wrong entry if there is more than one with the same name void refresh(String name,int i) throws SQLException{ System.out.println("refresh ..."); Statement stmt; try { stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM film_local WHERE titel = '"+name+"';" ); mainWindowController.newDaten.set(i, new streamUiData(1, 1, 1, rs.getDouble(1), "1", rs.getString(2), rs.getString(3))); stmt.close(); rs.close(); } catch (SQLException e) { try { stmt = connection.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM film_streaming WHERE titel = '"+name+"';" ); mainWindowController.streamData.set(i,new streamUiData(rs.getInt(1), rs.getInt(2), rs.getInt(3), rs.getDouble(4), rs.getString(5), rs.getString(6), rs.getString(7))); stmt.close(); rs.close(); } catch (SQLException e1) { System.err.println("Ups! an error occured!"); e1.printStackTrace(); } } } private void checkRemoveEntry() throws SQLException{ System.out.println("checking for entrys to remove to DB ..."); Statement stmt = connection.createStatement(); for(int a=0; a