From 0ab36507fffe98c9ec7d60f29a9c7b0391fc9532 Mon Sep 17 00:00:00 2001
From: Tharre <tharre3@gmail.com>
Date: Fri, 4 May 2018 15:17:44 +0200
Subject: Add SpringFXMLLoader

---
 .../groupphase/util/SpringFXMLLoader.java          | 212 +++++++++++++++++++++
 1 file changed, 212 insertions(+)
 create mode 100644 src/main/java/at/ac/tuwien/sepm/assignment/groupphase/util/SpringFXMLLoader.java

(limited to 'src/main/java/at/ac/tuwien')

diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/util/SpringFXMLLoader.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/util/SpringFXMLLoader.java
new file mode 100644
index 0000000..cb1f510
--- /dev/null
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/util/SpringFXMLLoader.java
@@ -0,0 +1,212 @@
+package at.ac.tuwien.sepm.assignment.groupphase.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import javafx.fxml.FXMLLoader;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.ApplicationContext;
+import org.springframework.stereotype.Component;
+
+/**
+ * A Spring Based FXMLLoader.
+ *
+ * <p>Provides the possibility to load FXML-Files and wrap them for convenient access to the loaded
+ * class as well as the spring loaded controller.
+ */
+@Component
+public class SpringFXMLLoader {
+
+    private Logger LOG = LoggerFactory.getLogger(SpringFXMLLoader.class);
+
+    private ApplicationContext applicationContext;
+
+    @Autowired
+    public SpringFXMLLoader(ApplicationContext applicationContext) {
+        this.applicationContext = applicationContext;
+    }
+
+    private FXMLLoader getFXMLLoader() {
+        final var fxmlLoader = new FXMLLoader();
+        fxmlLoader.setControllerFactory(applicationContext::getBean);
+        return fxmlLoader;
+    }
+
+    /**
+     * Load and return an object from an FXML-File.
+     *
+     * @param inputStream the input stream of the FXML-File
+     * @param loadType the class of the object to load
+     * @param <TLoad> the loaded object
+     * @return the loaded object
+     * @throws IOException if the resource could not be loaded
+     */
+    public synchronized <TLoad> TLoad load(InputStream inputStream, Class<TLoad> loadType)
+            throws IOException {
+        LOG.trace(
+                "Loading object of type {} from fxml resource {}",
+                loadType.getCanonicalName(),
+                inputStream);
+        return this.getFXMLLoader().load(inputStream);
+    }
+
+    /**
+     * Load and return an object from an FXML-File.
+     *
+     * @param pathToFXMLFile path to the FXML-File
+     * @param loadType the class of the object to load
+     * @param <TLoad> the loaded object
+     * @return the loaded object
+     * @throws IOException if the resource could not be loaded
+     */
+    public <TLoad> TLoad load(String pathToFXMLFile, Class<TLoad> loadType) throws IOException {
+        return this.load(SpringFXMLLoader.class.getResourceAsStream(pathToFXMLFile), loadType);
+    }
+
+    /**
+     * Load and return an object from an FXML-File.
+     *
+     * @param inputStream the input stream of the FXML-File
+     * @return the loaded object
+     * @throws IOException if the resource could not be loaded
+     */
+    public Object load(InputStream inputStream) throws IOException {
+        return this.load(inputStream, Object.class);
+    }
+
+    /**
+     * Load and return an object from an FXML-File.
+     *
+     * @param pathToFXMLFile path to the FXML-File
+     * @return the loaded object
+     * @throws IOException if the resource could not be loaded
+     */
+    public Object load(String pathToFXMLFile) throws IOException {
+        return this.load(SpringFXMLLoader.class.getResourceAsStream(pathToFXMLFile));
+    }
+
+    /**
+     * Load and wrap an object and the declared controller from an FXML-File.
+     *
+     * @param inputStream the input stream of the FXML-File
+     * @param loadType the class of the object to load
+     * @param controllerType the class of the declared controller of the loaded object
+     * @param <TLoad> the loaded object
+     * @param <TController> the controller of the loaded object
+     * @return a wrapper object containing the loaded object and its declared controller
+     * @throws IOException if the resource could not be loaded
+     * @see FXMLWrapper
+     */
+    public synchronized <TLoad, TController> FXMLWrapper<TLoad, TController> loadAndWrap(
+            InputStream inputStream, Class<TLoad> loadType, Class<TController> controllerType)
+            throws IOException {
+        final var fxmlLoader = this.getFXMLLoader();
+        LOG.trace(
+                "Loading and wrapping object of type {} with controller of type {} from fxml resource {}",
+                loadType.getCanonicalName(),
+                controllerType.getCanonicalName(),
+                inputStream);
+        return new FXMLWrapper<>(fxmlLoader.load(inputStream), fxmlLoader.getController());
+    }
+
+    /**
+     * Load and wrap an object and the declared controller from an FXML-File.
+     *
+     * @param pathToFXMLFile path to the FXML-File
+     * @param loadType the class of the object to load
+     * @param controllerType the class of the declared controller of the loaded object
+     * @param <TLoad> the loaded object
+     * @param <TController> the controller of the loaded object
+     * @return a wrapper object containing the loaded object and its declared controller
+     * @throws IOException if the resource could not be loaded
+     * @see FXMLWrapper
+     */
+    public synchronized <TLoad, TController> FXMLWrapper<TLoad, TController> loadAndWrap(
+            String pathToFXMLFile, Class<TLoad> loadType, Class<TController> controllerType)
+            throws IOException {
+        return this.loadAndWrap(
+                SpringFXMLLoader.class.getResourceAsStream(pathToFXMLFile),
+                loadType,
+                controllerType);
+    }
+
+    /**
+     * Load and wrap an object and the declared controller from an FXML-File.
+     *
+     * @param inputStream the input stream of the FXML-File
+     * @param controllerType the class of the declared controller of the loaded object
+     * @param <TController> the controller of the loaded object
+     * @return a wrapper object containing the loaded object and its declared controller
+     * @throws IOException if the resource could not be loaded
+     * @see FXMLWrapper
+     */
+    public <TController> FXMLWrapper<Object, TController> loadAndWrap(
+            InputStream inputStream, Class<TController> controllerType) throws IOException {
+        return this.loadAndWrap(inputStream, Object.class, controllerType);
+    }
+
+    /**
+     * Load and wrap an object and the declared controller from an FXML-File.
+     *
+     * @param pathToFXMLFile path to the FXML-File
+     * @param controllerType the class of the declared controller of the loaded object
+     * @param <TController> the controller of the loaded object
+     * @return a wrapper object containing the loaded object and its declared controller
+     * @throws IOException if the resource could not be loaded
+     * @see FXMLWrapper
+     */
+    public <TController> FXMLWrapper<Object, TController> loadAndWrap(
+            String pathToFXMLFile, Class<TController> controllerType) throws IOException {
+        return this.loadAndWrap(pathToFXMLFile, Object.class, controllerType);
+    }
+
+    /**
+     * Load and wrap an object and the declared controller from an FXML-File.
+     *
+     * @param inputStream the input stream of the FXML-File
+     * @return a wrapper object containing the loaded object and its declared controller
+     * @throws IOException if the resource could not be loaded
+     * @see FXMLWrapper
+     */
+    public FXMLWrapper<Object, Object> loadAndWrap(InputStream inputStream) throws IOException {
+        return this.loadAndWrap(inputStream, Object.class, Object.class);
+    }
+
+    /**
+     * Load and wrap an object and the declared controller from an FXML-File.
+     *
+     * @param pathToFXMLFile path to the FXML-File
+     * @return a wrapper object containing the loaded object and its declared controller
+     * @throws IOException if the resource could not be loaded
+     * @see FXMLWrapper
+     */
+    public FXMLWrapper<Object, Object> loadAndWrap(String pathToFXMLFile) throws IOException {
+        return this.loadAndWrap(pathToFXMLFile, Object.class, Object.class);
+    }
+
+    /**
+     * A wrapper for loading FXML-files and wrapping the loaded object as well as the controller.
+     *
+     * @param <TLoad> the loaded object
+     * @param <TController> the controller of the loaded object
+     */
+    public class FXMLWrapper<TLoad, TController> {
+
+        public TLoad getLoadedObject() {
+            return loadedObject;
+        }
+
+        public TController getController() {
+            return controller;
+        }
+
+        private final TLoad loadedObject;
+        private final TController controller;
+
+        private FXMLWrapper(TLoad loadedObject, TController controller) {
+            this.loadedObject = loadedObject;
+            this.controller = controller;
+        }
+    }
+}
-- 
cgit v1.2.3-70-g09d2