diff --git a/src/main/java/kellerkinder/HomeFlix/application/Main.java b/src/main/java/kellerkinder/HomeFlix/application/Main.java index 6e519d8..33b7938 100644 --- a/src/main/java/kellerkinder/HomeFlix/application/Main.java +++ b/src/main/java/kellerkinder/HomeFlix/application/Main.java @@ -85,8 +85,6 @@ public class Main extends Application { primaryStage.setScene(scene); // append scene to stage primaryStage.show(); // show stage - - mainWindowController = loader.getController(); //Link of FXMLController and controller class mainWindowController.init(); diff --git a/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java b/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java index 4965855..57bfac4 100644 --- a/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java +++ b/src/main/java/kellerkinder/HomeFlix/application/MainWindowController.java @@ -32,6 +32,7 @@ import java.io.InputStreamReader; import java.io.Writer; import java.math.BigInteger; import java.net.URLConnection; +import java.util.ArrayList; import java.util.Locale; import java.util.ResourceBundle; import java.util.concurrent.ExecutorService; @@ -53,6 +54,7 @@ import com.jfoenix.controls.JFXToggleButton; import com.jfoenix.transitions.hamburger.HamburgerBackArrowBasicTransition; import javafx.animation.TranslateTransition; +import javafx.application.Platform; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; @@ -60,6 +62,7 @@ import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.fxml.FXML; +import javafx.scene.Node; import javafx.scene.control.ChoiceBox; import javafx.scene.control.ContextMenu; import javafx.scene.control.Label; @@ -79,6 +82,8 @@ import javafx.scene.layout.HBox; import javafx.scene.layout.VBox; import javafx.scene.paint.Color; import javafx.scene.text.Font; +import javafx.scene.text.FontWeight; +import javafx.scene.text.Text; import javafx.scene.text.TextFlow; import javafx.stage.DirectoryChooser; import javafx.stage.FileChooser; @@ -195,7 +200,7 @@ public class MainWindowController { @FXML public void initialize() { xmlController = new XMLController(); - dbController = new DBController(this); + dbController = DBController.getInstance(); } public void init() { @@ -210,6 +215,7 @@ public class MainWindowController { initUI(); initActions(); dbController.init(); + refreshAllFilms(); // load sources list in gui addSourceToTable(); @@ -318,7 +324,7 @@ public class MainWindowController { public void changed(ObservableValue ov, Number old_val, Number new_val) { XMLController.setFontSize(fontsizeSlider.getValue()); if (!getCurrentTitle().isEmpty()) { - dbController.readCache(getCurrentStreamUrl()); + setSelectedFilmInfo(dbController.readCache(getCurrentStreamUrl())); } xmlController.saveSettings(); } @@ -355,7 +361,7 @@ public class MainWindowController { @Override public void handle(ActionEvent event) { dbController.like(getCurrentStreamUrl()); - dbController.refresh(getCurrentStreamUrl(), indexList); + filmsList.set(indexList, dbController.getDatabaseFilm(getCurrentStreamUrl())); refreshTableElement(); } }); @@ -364,7 +370,7 @@ public class MainWindowController { @Override public void handle(ActionEvent event) { dbController.dislike(getCurrentStreamUrl()); - dbController.refresh(getCurrentStreamUrl(), indexList); + filmsList.set(indexList, dbController.getDatabaseFilm(getCurrentStreamUrl())); refreshTableElement(); } }); @@ -423,11 +429,28 @@ public class MainWindowController { if (currentTableFilm.getCached() || dbController.searchCacheByURL(getCurrentStreamUrl())) { LOGGER.info("loading from cache: " + getCurrentTitle()); - dbController.readCache(getCurrentStreamUrl()); + setSelectedFilmInfo(dbController.readCache(getCurrentStreamUrl())); } else { - Thread omdbAPIThread = new Thread(new OMDbAPIController(dbController, currentTableFilm, XMLController.getOmdbAPIKey(), true)); - omdbAPIThread.setName("OMDbAPI"); - omdbAPIThread.start(); + // this is not perfect! + new Thread(new Runnable() { + public void run() { + Thread omdbAPIThread = new Thread(new OMDbAPIController(dbController, currentTableFilm, XMLController.getOmdbAPIKey())); + omdbAPIThread.setName("OMDbAPI"); + omdbAPIThread.start(); + + synchronized (omdbAPIThread) { + try { + omdbAPIThread.wait(); + } catch (InterruptedException e) { + LOGGER.error(e); + } + // update the GUI for the selected film + Platform.runLater(() -> { + setSelectedFilmInfo(dbController.readCache(getCurrentStreamUrl())); + }); + } + } + }).start(); } } }); @@ -585,6 +608,18 @@ public class MainWindowController { filmRoot.getChildren().get(indexTable).setValue(filmsList.get(indexList)); } + /** + * refresh all films in filmsList and in filmsTable + * clear the FilmsList and FilmRoot children, then update the database + */ + private void refreshAllFilms() { + getFilmsList().clear(); + getFilmRoot().getChildren().clear(); + dbController.refreshDataBase(); // refreshes the database after a source path was added + filmsList = dbController.getDatabaseFilmsList(); // returns a list of all films stored in the database + addFilmsToTable(filmsList); + } + /** * add data from films-list to films-table */ @@ -657,8 +692,9 @@ public class MainWindowController { getSourcesList().clear(); getSourceRoot().getChildren().clear(); - // update the database and all films from the database - dbController.refreshDataBase(); + // clear the FilmsList and FilmRoot children, then update the database + refreshAllFilms(); + checkAllPosters(); // check if there is anything to cache } @@ -732,7 +768,7 @@ public class MainWindowController { /** * set the local based on the languageChoisBox selection */ - void setLocalUI() { + private void setLocalUI() { switch (XMLController.getUsrLocal()) { case "en_US": XMLController.setLocalBundle(ResourceBundle.getBundle("locals.HomeFlix-Local", Locale.US)); // us_English @@ -768,6 +804,62 @@ public class MainWindowController { columnEpisode.setText(XMLController.getLocalBundle().getString("columnEpisode")); } + private void setSelectedFilmInfo(String[] cacheData) { + Font font = Font.font("System", FontWeight.BOLD, (int) Math.round(XMLController.getFontSize())); + ObservableList textFlow = getTextFlow().getChildren(); + + // TODO this should move! *** + ArrayList nameText = new ArrayList(); + nameText.add(new Text(XMLController.getLocalBundle().getString("title") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("year") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("rated") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("released") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("season") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("episode") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("runtime") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("genre") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("director") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("writer") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("actors") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("plot") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("language") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("country") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("awards") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("metascore") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("imdbRating") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("type") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("boxOffice") + ": ")); + nameText.add(new Text(XMLController.getLocalBundle().getString("website") + ": ")); + // *** + + // set the correct font for the nameText + for (Text text : nameText) { + text.setFont(font); + } + + // clear the textFlow and add the new text + textFlow.clear(); + + // TODO rework + for(int i = 0; i < 20; i++) { + if (cacheData[i] != null && (i == 5 || i == 6) && cacheData[5].length() == 0) { + // do nothing + } else if(cacheData[i] != null){ + textFlow.addAll(nameText.get(i), new Text(cacheData[i] + "\n")); + } + } + + getTextFlow().setStyle("-fx-font-size : " + ((int) Math.round(XMLController.getFontSize()) + 1) + "px;"); + + // add the image + try { + getPosterImageView().setImage(new Image(new File(cacheData[20]).toURI().toString())); + } catch (Exception e) { + getPosterImageView().setImage(new Image("icons/close_black_2048x2048.png")); + LOGGER.error("No Poster found, useing default."); + } + } + // if AutoUpdate, then check for updates private void checkAutoUpdate() { @@ -810,12 +902,15 @@ public class MainWindowController { for (FilmTabelDataType entry : dbController.getAllNotCachedEntries()) { System.out.println(entry.getStreamUrl() + " is NOT cached!"); - Runnable OMDbAPIWorker = new OMDbAPIController(dbController, entry, XMLController.getOmdbAPIKey(), false); + Runnable OMDbAPIWorker = new OMDbAPIController(dbController, entry, XMLController.getOmdbAPIKey()); executor.execute(OMDbAPIWorker); } executor.shutdown(); // TODO show loading screen + + // update all elements from the database + refreshAllFilms(); } // getter and setter diff --git a/src/main/java/kellerkinder/HomeFlix/controller/DBController.java b/src/main/java/kellerkinder/HomeFlix/controller/DBController.java index 78a347c..6e87e16 100644 --- a/src/main/java/kellerkinder/HomeFlix/controller/DBController.java +++ b/src/main/java/kellerkinder/HomeFlix/controller/DBController.java @@ -21,7 +21,6 @@ package kellerkinder.HomeFlix.controller; -import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.net.URLConnection; @@ -37,21 +36,17 @@ import java.util.List; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import javafx.collections.FXCollections; import javafx.collections.ObservableList; -import javafx.scene.Node; import javafx.scene.image.Image; import javafx.scene.image.ImageView; -import javafx.scene.text.Font; -import javafx.scene.text.FontWeight; -import javafx.scene.text.Text; -import kellerkinder.HomeFlix.application.MainWindowController; import kellerkinder.HomeFlix.datatypes.DatabaseDataType; import kellerkinder.HomeFlix.datatypes.FilmTabelDataType; import kellerkinder.HomeFlix.datatypes.OMDbAPIResponseDataType; public class DBController { - private MainWindowController mainWindowController; + private static DBController instance = null; private String DB_PATH; private Image favorite_black = new Image("icons/ic_favorite_black_18dp_1x.png"); private Image favorite_border_black = new Image("icons/ic_favorite_border_black_18dp_1x.png"); @@ -65,8 +60,16 @@ public class DBController { * @param main the Main object * @param mainWindowController the MainWindowController object */ - public DBController(MainWindowController mainWindowController) { - this.mainWindowController = mainWindowController; + public DBController() { + // Auto-generated constructor stub + } + + public static DBController getInstance() { + if (instance == null) { + instance = new DBController(); + } + + return instance; } /** @@ -148,11 +151,12 @@ public class DBController { } /** - * load the data to the mainWindowController + * load the data from the database to a ObservableList * order entries by title + * @return a ObservableList that contains all films from the database */ - private void loadDataToFilmsList() { - ImageView imageView; + public ObservableList getDatabaseFilmsList() { + ObservableList filmsList = FXCollections.observableArrayList(); LOGGER.info("loading data to mwc ..."); try { //load local Data @@ -160,8 +164,8 @@ public class DBController { ResultSet rs = stmt.executeQuery("SELECT * FROM films ORDER BY title"); while (rs.next()) { - imageView = rs.getBoolean("favorite") ? new ImageView(favorite_black) : new ImageView(favorite_border_black); - mainWindowController.getFilmsList().add(new FilmTabelDataType(rs.getString("streamUrl"), + ImageView imageView = rs.getBoolean("favorite") ? new ImageView(favorite_black) : new ImageView(favorite_border_black); + filmsList.add(new FilmTabelDataType(rs.getString("streamUrl"), rs.getString("title"), rs.getString("season"), rs.getString("episode") ,rs.getBoolean("favorite"), rs.getBoolean("cached"), imageView)); } @@ -172,15 +176,17 @@ public class DBController { } LOGGER.info("loading data to the GUI ..."); - mainWindowController.addFilmsToTable(mainWindowController.getFilmsList()); + + return filmsList; } /** - * refresh data in mainWindowController for one element + * get one film from the database with streamUrl = ? * @param streamUrl of the film - * @param index of the film in LocalFilms list + * @return a FilmTabelDataType Object of the film with the given streamUrl */ - public void refresh(String streamUrl, int indexList) { + public FilmTabelDataType getDatabaseFilm(String streamUrl) { + FilmTabelDataType film = null; LOGGER.info("refresh data for " + streamUrl); try { PreparedStatement ps = connection.prepareStatement("SELECT * FROM films WHERE streamUrl = ?"); @@ -189,21 +195,21 @@ public class DBController { while (rs.next()) { ImageView imageView = rs.getBoolean("favorite") ? new ImageView(favorite_black) : new ImageView(favorite_border_black); - mainWindowController.getFilmsList().set(indexList, new FilmTabelDataType(rs.getString("streamUrl"), + film = new FilmTabelDataType(rs.getString("streamUrl"), rs.getString("title"), rs.getString("season"), rs.getString("episode"), rs.getBoolean("favorite"), - rs.getBoolean("cached"), imageView)); + rs.getBoolean("cached"), imageView); } rs.close(); ps.close(); } catch (Exception e) { LOGGER.error("Ups! error while refreshing mwc!", e); - } + } + + return film; } /** * refresh database to contain all (new added) entries - * refresh the MainWindowController content, - * to contain all (new added) entries from the database */ public void refreshDataBase() { LOGGER.info("refreshing the Database ..."); @@ -223,12 +229,6 @@ public class DBController { } catch (Exception e) { LOGGER.error("Error while refreshing the database", e); } - - // clear the FilmsList and FilmRoot children - mainWindowController.getFilmsList().clear(); - mainWindowController.getFilmRoot().getChildren().clear(); - - loadDataToFilmsList(); // load the new data to the FilmsList } /** @@ -373,8 +373,6 @@ public class DBController { } catch (SQLException e) { LOGGER.error("Ups! an error occured!", e); } - - refresh(streamUrl, mainWindowController.getIndexList()); } /** @@ -445,79 +443,40 @@ public class DBController { } /** - * sets the cached data to mwc's TextFlow + * read the cached data from the Database * @param streamUrl URL of the film + * @return a String array (length = 21) with all cached data */ - public void readCache(String streamUrl) { + public String[] readCache(String streamUrl) { + String[] cacheData = new String[21]; + try { PreparedStatement ps = connection.prepareStatement("SELECT * FROM cache WHERE streamUrl = ?"); ps.setString(1, streamUrl); ResultSet rs = ps.executeQuery(); - Font font = Font.font("System", FontWeight.BOLD, (int) Math.round(XMLController.getFontSize())); - ObservableList textFlow = mainWindowController.getTextFlow().getChildren(); - ArrayList nameText = new ArrayList(); - nameText.add(new Text(XMLController.getLocalBundle().getString("title") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("year") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("rated") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("released") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("season") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("episode") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("runtime") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("genre") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("director") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("writer") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("actors") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("plot") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("language") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("country") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("awards") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("metascore") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("imdbRating") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("type") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("boxOffice") + ": ")); - nameText.add(new Text(XMLController.getLocalBundle().getString("website") + ": ")); - - // set the correct font for the nameText - for (Text text : nameText) { - text.setFont(font); - } - - // clear the textFlow and all the new text - textFlow.clear(); - textFlow.addAll(nameText.get(0), new Text(rs.getString("Title") + "\n")); - textFlow.addAll(nameText.get(1), new Text(rs.getString("Year") + "\n")); - textFlow.addAll(nameText.get(2), new Text(rs.getString("Rated") + "\n")); - textFlow.addAll(nameText.get(3), new Text(rs.getString("Released") + "\n")); - - if (rs.getString("Episode").length() > 0) { - textFlow.addAll(nameText.get(4), new Text(rs.getString("Season") + "\n")); - textFlow.addAll(nameText.get(5), new Text(rs.getString("Episode") + "\n")); - } - - textFlow.addAll(nameText.get(6), new Text(rs.getString("Runtime") + "\n")); - textFlow.addAll(nameText.get(7), new Text(rs.getString("Genre") + "\n")); - textFlow.addAll(nameText.get(8), new Text(rs.getString("Director") + "\n")); - textFlow.addAll(nameText.get(9), new Text(rs.getString("Writer") + "\n")); - textFlow.addAll(nameText.get(10), new Text(rs.getString("Actors") + "\n")); - textFlow.addAll(nameText.get(11), new Text(rs.getString("Plot") + "\n")); - textFlow.addAll(nameText.get(12), new Text(rs.getString("Language") + "\n")); - textFlow.addAll(nameText.get(13), new Text(rs.getString("Country") + "\n")); - textFlow.addAll(nameText.get(14), new Text(rs.getString("Awards") + "\n")); - textFlow.addAll(nameText.get(15), new Text(rs.getString("metascore") + "\n")); - textFlow.addAll(nameText.get(16), new Text(rs.getString("imdbRating") + "\n")); - textFlow.addAll(nameText.get(17), new Text(rs.getString("Type") + "\n")); - textFlow.addAll(nameText.get(18), new Text(rs.getString("BoxOffice") + "\n")); - textFlow.addAll(nameText.get(19), new Text(rs.getString("Website") + "\n")); - - mainWindowController.getTextFlow().setStyle("-fx-font-size : " + ((int) Math.round(XMLController.getFontSize()) + 1) + "px;"); - - // add the image - try { - mainWindowController.getPosterImageView().setImage(new Image(new File(rs.getString("Poster")).toURI().toString())); - } catch (Exception e) { - mainWindowController.getPosterImageView().setImage(new Image("icons/close_black_2048x2048.png")); - LOGGER.error("No Poster found, useing default."); + while (rs.next()) { + cacheData[0] = rs.getString("Title"); + cacheData[1] = rs.getString("Year"); + cacheData[2] = rs.getString("Rated"); + cacheData[3] = rs.getString("Released"); + cacheData[4] = rs.getString("Season"); + cacheData[5] = rs.getString("Episode"); + cacheData[6] = rs.getString("Runtime"); + cacheData[7] = rs.getString("Genre"); + cacheData[8] = rs.getString("Director"); + cacheData[9] = rs.getString("Writer"); + cacheData[10] = rs.getString("Actors"); + cacheData[11] = rs.getString("Plot"); + cacheData[12] = rs.getString("Language"); + cacheData[13] = rs.getString("Country"); + cacheData[14] = rs.getString("Awards"); + cacheData[15] = rs.getString("metascore"); + cacheData[16] = rs.getString("imdbRating"); + cacheData[17] = rs.getString("Type"); + cacheData[18] = rs.getString("BoxOffice"); + cacheData[19] = rs.getString("Website"); + cacheData[20] = rs.getString("Poster"); } rs.close(); @@ -525,6 +484,8 @@ public class DBController { } catch (SQLException e) { LOGGER.error("Ups! an error occured!", e); } + + return cacheData; } /** diff --git a/src/main/java/kellerkinder/HomeFlix/controller/OMDbAPIController.java b/src/main/java/kellerkinder/HomeFlix/controller/OMDbAPIController.java index 008d949..3ab3219 100644 --- a/src/main/java/kellerkinder/HomeFlix/controller/OMDbAPIController.java +++ b/src/main/java/kellerkinder/HomeFlix/controller/OMDbAPIController.java @@ -37,8 +37,6 @@ import com.eclipsesource.json.Json; import com.eclipsesource.json.JsonObject; import com.eclipsesource.json.JsonValue; -import javafx.application.Platform; -import kellerkinder.HomeFlix.application.MainWindowController; import kellerkinder.HomeFlix.datatypes.FilmTabelDataType; import kellerkinder.HomeFlix.datatypes.OMDbAPIResponseDataType; @@ -49,8 +47,7 @@ public class OMDbAPIController implements Runnable { private String omdbAPIKey; private String URL = "https://www.omdbapi.com/?apikey="; private boolean useEpisode = true; - private boolean refresh; - private static final Logger LOGGER = LogManager.getLogger(MainWindowController.class.getName()); + private static final Logger LOGGER = LogManager.getLogger(OMDbAPIController.class.getName()); /** * constructor for the OMDbAPIController @@ -59,11 +56,10 @@ public class OMDbAPIController implements Runnable { * @param currentTableFilm the current film object * @param omdbAPIKey the omdbAPI key */ - public OMDbAPIController(DBController dbController, FilmTabelDataType currentTableFilm, String omdbAPIKey, boolean refresh) { + public OMDbAPIController(DBController dbController, FilmTabelDataType currentTableFilm, String omdbAPIKey) { this.dbController = dbController; this.currentTableFilm = currentTableFilm; this.omdbAPIKey = omdbAPIKey; - this.refresh = refresh; } @Override @@ -136,13 +132,6 @@ public class OMDbAPIController implements Runnable { // adding to cache dbController.addCache(currentTableFilm.getStreamUrl(), omdbResponse); dbController.setCached(currentTableFilm.getStreamUrl()); - - // load data to the MainWindowController - if (refresh) { - Platform.runLater(() -> { - dbController.readCache(currentTableFilm.getStreamUrl()); - }); - } } return;