diff --git a/.gitignore b/.gitignore index 39744ba452acdf35cfd6316836a0611b4c1bcd65..240a234c67bd834019d85ee7ac27333447500a99 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ target/ .idea/ -*.properties *.iml bin/ .settings/ diff --git a/Album.pdf b/Album.pdf deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/import.sql.gz b/import.sql.gz new file mode 100644 index 0000000000000000000000000000000000000000..2c41c2ac96e5fbf1dd76445483ac3b601e3b96d9 Binary files /dev/null and b/import.sql.gz differ diff --git a/src/main/java/NTNU/IDATT1002/App.java b/src/main/java/NTNU/IDATT1002/App.java index 6441e9b91663087bc2fe7587c770008003f41b96..fb11cd8b0cecf4eba770e6b36b59facc550e194b 100644 --- a/src/main/java/NTNU/IDATT1002/App.java +++ b/src/main/java/NTNU/IDATT1002/App.java @@ -1,8 +1,8 @@ package NTNU.IDATT1002; import NTNU.IDATT1002.controllers.DataExchange; +import NTNU.IDATT1002.database.EntityManagerConfig; import javafx.application.Application; -import javafx.application.HostServices; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; @@ -14,13 +14,14 @@ import java.io.IOException; public class App extends Application { public static DataExchange ex; - public static HostServices hostServices; private static Scene scene; @Override public void start(Stage stage) throws IOException { ex = new DataExchange(); ex.setHostServices(getHostServices()); + ex.setEntityManager(EntityManagerConfig.getEntityManager()); + scene = new Scene(loadFXML("login")); stage.setMaximized(true); stage.setScene(scene); diff --git a/src/main/java/NTNU/IDATT1002/ApplicationState.java b/src/main/java/NTNU/IDATT1002/ApplicationState.java index 1b65e202df36017b0564711d806e4af00f0b8767..cc727dcaa48d7e397c8ece1723e2e3f5fff2be11 100644 --- a/src/main/java/NTNU/IDATT1002/ApplicationState.java +++ b/src/main/java/NTNU/IDATT1002/ApplicationState.java @@ -1,12 +1,11 @@ package NTNU.IDATT1002; +import NTNU.IDATT1002.database.EntityManagerConfig; import NTNU.IDATT1002.models.User; import NTNU.IDATT1002.repository.UserRepository; import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.Persistence; /** * Class Application State. Keeps a record of the global application state, such as the current logged in user. @@ -29,8 +28,7 @@ public final class ApplicationState { * Initiate properties and save an anonymous user once. */ static { - EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ImageApplication"); - EntityManager entityManager = entityManagerFactory.createEntityManager(); + EntityManager entityManager = EntityManagerConfig.getEntityManager(); userRepository = new UserRepository(entityManager); } diff --git a/src/main/java/NTNU/IDATT1002/controllers/CreateAlbum.java b/src/main/java/NTNU/IDATT1002/controllers/CreateAlbum.java index 09681920fe8fa585550f9b92092830c71b54b209..54ef33fa2a52e51325520715a59f84b2c1c6eef8 100644 --- a/src/main/java/NTNU/IDATT1002/controllers/CreateAlbum.java +++ b/src/main/java/NTNU/IDATT1002/controllers/CreateAlbum.java @@ -13,6 +13,7 @@ import javafx.scene.input.MouseEvent; import javafx.scene.layout.GridPane; import javafx.scene.layout.Pane; +import javax.persistence.EntityManager; import java.io.IOException; /** @@ -39,7 +40,8 @@ public class CreateAlbum { private ImageAlbumService imageAlbumService; public CreateAlbum() { - imageAlbumService = new ImageAlbumService(); + EntityManager entityManager = App.ex.getEntityManager(); + imageAlbumService = new ImageAlbumService(entityManager); } /** diff --git a/src/main/java/NTNU/IDATT1002/controllers/DataExchange.java b/src/main/java/NTNU/IDATT1002/controllers/DataExchange.java index 8e3f78d487b29e9842af7930125bce080542b77e..3a44807b958285650c2141748d414c7fc76769d2 100644 --- a/src/main/java/NTNU/IDATT1002/controllers/DataExchange.java +++ b/src/main/java/NTNU/IDATT1002/controllers/DataExchange.java @@ -2,6 +2,7 @@ package NTNU.IDATT1002.controllers; import javafx.application.HostServices; +import javax.persistence.EntityManager; import java.io.File; import java.util.List; @@ -12,6 +13,7 @@ import java.util.List; */ public class DataExchange { + private EntityManager entityManager; public HostServices hostServices; private String searchField; private List<File> uploadedFiles; @@ -22,6 +24,10 @@ public class DataExchange { searchField = ""; } + public EntityManager getEntityManager() { + return entityManager; + } + public HostServices getHostServices() { return hostServices; } @@ -42,6 +48,10 @@ public class DataExchange { return chosenImg; } + public void setEntityManager(EntityManager entityManager) { + this.entityManager = entityManager; + } + public void setHostServices(HostServices hostServices) { this.hostServices = hostServices; } diff --git a/src/main/java/NTNU/IDATT1002/controllers/ExploreAlbums.java b/src/main/java/NTNU/IDATT1002/controllers/ExploreAlbums.java index a545a48ed548dbe5acd247dbaa2a6834de17770f..4ad548577cef5327884738d1db06f9ac67e519da 100644 --- a/src/main/java/NTNU/IDATT1002/controllers/ExploreAlbums.java +++ b/src/main/java/NTNU/IDATT1002/controllers/ExploreAlbums.java @@ -21,6 +21,7 @@ import javafx.scene.shape.StrokeType; import javafx.scene.text.Font; import javafx.scene.text.Text; +import javax.persistence.EntityManager; import java.io.IOException; import java.net.URL; import java.util.List; @@ -64,7 +65,8 @@ public class ExploreAlbums implements Initializable { private ImageAlbumService imageAlbumService; public ExploreAlbums() { - imageAlbumService = new ImageAlbumService(); + EntityManager entityManager = App.ex.getEntityManager(); + imageAlbumService = new ImageAlbumService(entityManager); } /** diff --git a/src/main/java/NTNU/IDATT1002/controllers/Login.java b/src/main/java/NTNU/IDATT1002/controllers/Login.java index 0e3aa8cfcbf3bc691447dc1f6d7aab785ffa7fd7..58c331dd1209c0661fded156c6548c36baf01987 100644 --- a/src/main/java/NTNU/IDATT1002/controllers/Login.java +++ b/src/main/java/NTNU/IDATT1002/controllers/Login.java @@ -1,17 +1,14 @@ package NTNU.IDATT1002.controllers; -import java.io.IOException; - import NTNU.IDATT1002.App; -import NTNU.IDATT1002.ApplicationState; -import NTNU.IDATT1002.models.User; import NTNU.IDATT1002.service.UserService; import javafx.event.ActionEvent; import javafx.scene.control.Button; import javafx.scene.control.PasswordField; import javafx.scene.control.TextField; -import javax.security.auth.login.FailedLoginException; +import javax.persistence.EntityManager; +import java.io.IOException; /** * Controls the buttons and changeable elements on login.fxml, @@ -27,6 +24,11 @@ public class Login { public Button login; private UserService userService; + public Login() { + EntityManager entityManager = App.ex.getEntityManager(); + userService = new UserService(entityManager); + } + /** * Method that changes scene to Sign Up page * @param actionEvent @@ -42,7 +44,6 @@ public class Login { * @throws IOException */ public void login(ActionEvent actionEvent) throws IOException { - userService = new UserService(); String username = Username.getText(); String password = Password.getText(); if(userService.logIn(username, password)) { diff --git a/src/main/java/NTNU/IDATT1002/controllers/SignUp.java b/src/main/java/NTNU/IDATT1002/controllers/SignUp.java index 2b8cc0eafd54ed287139a02d5e3db0cf0b19b1be..f1b932ef9a554afcb779bcdd811a14d603f77b08 100644 --- a/src/main/java/NTNU/IDATT1002/controllers/SignUp.java +++ b/src/main/java/NTNU/IDATT1002/controllers/SignUp.java @@ -1,11 +1,6 @@ package NTNU.IDATT1002.controllers; -import java.io.IOException; -import java.util.Date; -import java.util.Optional; - import NTNU.IDATT1002.App; -import NTNU.IDATT1002.models.User; import NTNU.IDATT1002.service.UserService; import javafx.event.ActionEvent; import javafx.scene.control.Button; @@ -14,6 +9,10 @@ import javafx.scene.control.PasswordField; import javafx.scene.control.TextField; import javafx.scene.layout.GridPane; +import javax.persistence.EntityManager; +import java.io.IOException; +import java.util.Date; + /** * Controls the buttons and changeable elements on signup.fxml, * a page where you create a new user for the application @@ -30,10 +29,16 @@ public class SignUp { public TextField signup_phoneCode; public TextField signup_phoneNr; public DatePicker signup_birthDate; - public UserService userService = new UserService(); + + public UserService userService; public Button signup_btn; + public SignUp() { + EntityManager entityManager = App.ex.getEntityManager(); + userService = new UserService(entityManager); + } + /** * Method that changes scene to Login * @param actionEvent diff --git a/src/main/java/NTNU/IDATT1002/controllers/UploadedSingle.java b/src/main/java/NTNU/IDATT1002/controllers/UploadedSingle.java index 52ac87342708a859fb86c3491ed52e0a9de1864d..63ab9e2616b8cbdc4b22e2434027f02b845d8ec8 100644 --- a/src/main/java/NTNU/IDATT1002/controllers/UploadedSingle.java +++ b/src/main/java/NTNU/IDATT1002/controllers/UploadedSingle.java @@ -13,6 +13,7 @@ import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.input.MouseEvent; +import javax.persistence.EntityManager; import java.io.File; import java.io.IOException; import java.net.URL; @@ -55,8 +56,13 @@ public class UploadedSingle implements Initializable { * @param resources */ public void initialize(URL location, ResourceBundle resources) { - photo_image.setImage(new Image(App.ex.getUploadedFiles().get(0).toURI().toString())); - imageService = new ImageService(); + photo_image.setImage(new Image(App.ex.getUploadedFiles() + .get(0) + .toURI() + .toString())); + + EntityManager entityManager = App.ex.getEntityManager(); + imageService = new ImageService(entityManager); } /** diff --git a/src/main/java/NTNU/IDATT1002/controllers/ViewAlbum.java b/src/main/java/NTNU/IDATT1002/controllers/ViewAlbum.java index 9003f14bb5c5a74124f1c7c463ee29e75e60aa95..ce82b27642124178a59f9bd90619ca99a2de4d31 100644 --- a/src/main/java/NTNU/IDATT1002/controllers/ViewAlbum.java +++ b/src/main/java/NTNU/IDATT1002/controllers/ViewAlbum.java @@ -21,6 +21,7 @@ import javafx.scene.text.Text; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.persistence.EntityManager; import java.io.File; import java.io.IOException; import java.net.URL; @@ -70,9 +71,13 @@ public class ViewAlbum implements Initializable { private ImageAlbumService imageAlbumService; private Long currentAlbumId; + private Logger logger; + public ViewAlbum() { - imageAlbumService = new ImageAlbumService(); + EntityManager entityManager = App.ex.getEntityManager(); + this.imageAlbumService = new ImageAlbumService(entityManager); currentAlbumId = App.ex.getChosenAlbumId(); + logger = LoggerFactory.getLogger("ImageApplicationLogger"); } /** diff --git a/src/main/java/NTNU/IDATT1002/database/EntityManagerConfig.java b/src/main/java/NTNU/IDATT1002/database/EntityManagerConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..22d6059a579179ba1945809e05bb7c9fab33a5cc --- /dev/null +++ b/src/main/java/NTNU/IDATT1002/database/EntityManagerConfig.java @@ -0,0 +1,97 @@ +package NTNU.IDATT1002.database; + +import org.hibernate.cfg.Environment; + +import javax.persistence.*; +import java.util.*; + + +/** + * Entity Manager Configuration Singleton for overriding hibernate persistence properties. + * Provides a single global access point to the applications entity manager. + */ +public class EntityManagerConfig { + + private static EntityManager entityManager; + private static Map<String, Object> configOverrides = new HashMap<>(); + private static Properties properties = Environment.getProperties(); + + + private EntityManagerConfig() { + } + + /** + * Retrieve the entity manager instance. + * An entity manager is not created until it is requested. + * + * @return an entity manager instance + */ + public static EntityManager getEntityManager() { + if (entityManager == null) + configureEntityManager(); + + return entityManager; + } + + /** + * Parse properties and create the entity manager + */ + private static void configureEntityManager() { + if (shouldOverrideConfig()) + parseConfigProperties(); + + createEntityManager(); + } + + private static boolean shouldOverrideConfig() { + return Boolean.parseBoolean((String) properties.get("OVERRIDE_DEFAULT_DB_CONFIG")); + } + + /** + * Parse properties from resources/hibernate.properties and overrides found values. + */ + private static void parseConfigProperties() { + Set<Object> envKeys = properties.keySet(); + + for (Object key : envKeys) + parseProperty(key); + } + + /** + * Parse desired values from given key in properties and add them to the configuration overrides. + * + * @param key the key to parse + */ + private static void parseProperty(Object key) { + switch ((String) key) { + case "DB_DRIVER": + configOverrides.put("javax.persistence.jdbc.driver", properties.get(key)); + break; + case "DB_URL": + configOverrides.put("javax.persistence.jdbc.url", properties.get(key)); + break; + case "DB_USER": + configOverrides.put("javax.persistence.jdbc.user", properties.get(key)); + break; + case "DB_PASSWORD": + configOverrides.put("javax.persistence.jdbc.password", properties.get(key)); + break; + case "DB_DIALECT": + configOverrides.put("hibernate.dialect", properties.get(key)); + break; + case "DB_HBM2DDL": + configOverrides.put("hibernate.hbm2ddl.auto", properties.get(key)); + break; + default: + break; + } + } + + /** + * Create an entity manager with configurations overrides. + */ + private static void createEntityManager() { + EntityManagerFactory emf = Persistence.createEntityManagerFactory("ImageApplication", configOverrides); + entityManager = emf.createEntityManager(); + } +} diff --git a/src/main/java/NTNU/IDATT1002/database/LoadDatabase.java b/src/main/java/NTNU/IDATT1002/database/LoadDatabase.java index 769283e4e9c78a4c7f2dd6b84e64b170789720ad..ed1ac5a4bbe33a204296b331385a5c4f25ac0822 100644 --- a/src/main/java/NTNU/IDATT1002/database/LoadDatabase.java +++ b/src/main/java/NTNU/IDATT1002/database/LoadDatabase.java @@ -7,6 +7,7 @@ import NTNU.IDATT1002.service.ImageAlbumService; import NTNU.IDATT1002.service.ImageService; import NTNU.IDATT1002.service.UserService; +import javax.persistence.EntityManager; import java.io.File; import java.util.ArrayList; import java.util.Arrays; @@ -23,9 +24,11 @@ public class LoadDatabase { private static ImageService imageService; static { - userService = new UserService(); - imageAlbumService = new ImageAlbumService(); - imageService = new ImageService(); + EntityManager entityManager = EntityManagerConfig.getEntityManager(); + + userService = new UserService(entityManager); + imageAlbumService = new ImageAlbumService(entityManager); + imageService = new ImageService(entityManager); } public static void load() { diff --git a/src/main/java/NTNU/IDATT1002/models/GeoLocation.java b/src/main/java/NTNU/IDATT1002/models/GeoLocation.java index 39e282c8e1c35e86aeff26124d0c469d8cca7beb..b5404e32ba77710c6ac413cd3b754783edacfb1c 100644 --- a/src/main/java/NTNU/IDATT1002/models/GeoLocation.java +++ b/src/main/java/NTNU/IDATT1002/models/GeoLocation.java @@ -23,7 +23,7 @@ public class GeoLocation { * One to one relation between geolocationId in table Geolocation * Joins column geolocation_id in metadata */ - @OneToOne(mappedBy = "geolocation") + @OneToOne(mappedBy = "geolocation", fetch = FetchType.LAZY) private Metadata metadata; @NotBlank (message = "Altitude may not be blank") diff --git a/src/main/java/NTNU/IDATT1002/models/Histogram.java b/src/main/java/NTNU/IDATT1002/models/Histogram.java index c6e74f902a261f81dd9d208b4a1e6635b4424c2d..770a6aa48f8bc9a533f927893b2ba10d8f5eac22 100644 --- a/src/main/java/NTNU/IDATT1002/models/Histogram.java +++ b/src/main/java/NTNU/IDATT1002/models/Histogram.java @@ -23,7 +23,7 @@ public class Histogram { * One to one relations, joins histogramId * On columns histogramId in metadata */ - @OneToOne(mappedBy = "histogram") + @OneToOne(mappedBy = "histogram", fetch = FetchType.LAZY) private Metadata metadata; @Lob diff --git a/src/main/java/NTNU/IDATT1002/models/Image.java b/src/main/java/NTNU/IDATT1002/models/Image.java index 4b025ee3e42db5fc7c613556ddcb409b32e0a4bb..3559ee784c8b51f0e053a0ec7402243e518663a0 100644 --- a/src/main/java/NTNU/IDATT1002/models/Image.java +++ b/src/main/java/NTNU/IDATT1002/models/Image.java @@ -24,13 +24,13 @@ public class Image { @GeneratedValue private Long id; - @ManyToMany + @ManyToMany(fetch = FetchType.LAZY) private List<ImageAlbum> imageAlbums = new ArrayList<>(); - @ManyToMany + @ManyToMany(fetch = FetchType.LAZY) private List<Tag> tags = new ArrayList<>(); - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) private User user; @Lob @@ -38,7 +38,7 @@ public class Image { @NotEmpty private byte[] rawImage; - @OneToOne(cascade = CascadeType.ALL) + @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Metadata metadata; @NotBlank diff --git a/src/main/java/NTNU/IDATT1002/models/ImageAlbum.java b/src/main/java/NTNU/IDATT1002/models/ImageAlbum.java index 8607b3448154adc7dade24062a54c172acba0463..21ac9a4c7157ee12198fa9e1827831d2c0a2eb48 100644 --- a/src/main/java/NTNU/IDATT1002/models/ImageAlbum.java +++ b/src/main/java/NTNU/IDATT1002/models/ImageAlbum.java @@ -32,13 +32,13 @@ public class ImageAlbum { @NotBlank(message = "Title may not be blank") private String title; - @ManyToOne + @ManyToOne(fetch = FetchType.LAZY) private User user; - @ManyToMany + @ManyToMany(fetch = FetchType.LAZY) private List<Image> images = new ArrayList<>();; - @ManyToMany + @ManyToMany(fetch = FetchType.LAZY) private List<Tag> tags = new ArrayList<>();; private String description; diff --git a/src/main/java/NTNU/IDATT1002/models/Login.java b/src/main/java/NTNU/IDATT1002/models/Login.java index 00e7c3f03ed5e51c7a0023d27062e97586bd81eb..2f3af4129a63c6a49c257ca3618bc3a32e16291e 100644 --- a/src/main/java/NTNU/IDATT1002/models/Login.java +++ b/src/main/java/NTNU/IDATT1002/models/Login.java @@ -1,10 +1,7 @@ package NTNU.IDATT1002.models; -import org.hibernate.annotations.NaturalId; - import javax.persistence.*; import javax.validation.constraints.NotBlank; -import javax.validation.constraints.Size; @Entity @Table(name = "login") @@ -16,7 +13,7 @@ public class Login { private String username; - @OneToOne(cascade = {CascadeType.ALL}) + @OneToOne(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY) private User user; @NotBlank(message = "Hash salt may not be blank") diff --git a/src/main/java/NTNU/IDATT1002/models/Metadata.java b/src/main/java/NTNU/IDATT1002/models/Metadata.java index 45adbc7280f159fc52edd64f3e0b1621caed7c1d..b28d6e58c50d4d96c71e8e8cbcb87e8a7c69d967 100644 --- a/src/main/java/NTNU/IDATT1002/models/Metadata.java +++ b/src/main/java/NTNU/IDATT1002/models/Metadata.java @@ -22,13 +22,13 @@ public class Metadata { * One to one relation joining imageId * on image_id column in image */ - @OneToOne(mappedBy = "metadata") + @OneToOne(mappedBy = "metadata", fetch = FetchType.LAZY) private Image image; - @OneToOne(cascade = CascadeType.ALL) + @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private GeoLocation geolocation; - @OneToOne(cascade = CascadeType.ALL) + @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Histogram histogram; public Metadata() { diff --git a/src/main/java/NTNU/IDATT1002/models/Tag.java b/src/main/java/NTNU/IDATT1002/models/Tag.java index ccde4ddbab3aa873bfbb0d6a97a4a04360d3fa61..3545e6c38b0173e5bc2894c309700bce649d7f47 100644 --- a/src/main/java/NTNU/IDATT1002/models/Tag.java +++ b/src/main/java/NTNU/IDATT1002/models/Tag.java @@ -33,7 +33,7 @@ public class Tag { * Creates a many to many relations between tag and image * on table ImageTags, joining column tagId and imageId */ - @ManyToMany(cascade = {CascadeType.ALL}) + @ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY) @JoinTable( name = "image_tag", joinColumns = {@JoinColumn(name = "tag_id")}, @@ -44,7 +44,7 @@ public class Tag { /** * Creates a many to many relations between tag and image album */ - @ManyToMany(cascade = {CascadeType.ALL}) + @ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY) @JoinTable( name = "image_album_tags", joinColumns = {@JoinColumn(name = "tag_id")}, diff --git a/src/main/java/NTNU/IDATT1002/models/User.java b/src/main/java/NTNU/IDATT1002/models/User.java index 256ad9b1703f86925a620e666f77992cb96be4ae..9e055b5721c4efe5edfc107fc5f43b3552aa9fea 100644 --- a/src/main/java/NTNU/IDATT1002/models/User.java +++ b/src/main/java/NTNU/IDATT1002/models/User.java @@ -41,14 +41,16 @@ public class User { @OneToMany( mappedBy = "user", cascade = CascadeType.ALL, - orphanRemoval = true + orphanRemoval = true, + fetch = FetchType.LAZY ) private List<ImageAlbum> imageAlbums = new ArrayList<>(); @OneToMany( mappedBy = "user", cascade = CascadeType.ALL, - orphanRemoval = true + orphanRemoval = true, + fetch = FetchType.LAZY ) private List<Image> images = new ArrayList<>(); diff --git a/src/main/java/NTNU/IDATT1002/service/ImageAlbumService.java b/src/main/java/NTNU/IDATT1002/service/ImageAlbumService.java index 3ea88d385972e72c6fb54d3e79708ddfeb7cb0d9..d5b5cd0ee9bb746561cc8ea71038769a64393dfc 100644 --- a/src/main/java/NTNU/IDATT1002/service/ImageAlbumService.java +++ b/src/main/java/NTNU/IDATT1002/service/ImageAlbumService.java @@ -1,16 +1,14 @@ package NTNU.IDATT1002.service; +import NTNU.IDATT1002.filters.ImageAlbumFilter; import NTNU.IDATT1002.models.Image; import NTNU.IDATT1002.models.ImageAlbum; import NTNU.IDATT1002.models.Tag; import NTNU.IDATT1002.models.User; import NTNU.IDATT1002.repository.ImageAlbumRepository; import NTNU.IDATT1002.repository.TagRepository; -import NTNU.IDATT1002.filters.ImageAlbumFilter; import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.Persistence; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -36,10 +34,7 @@ public class ImageAlbumService { /** * Inject entity manager instance to the repositories. */ - public ImageAlbumService() { - EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ImageApplication"); - EntityManager entityManager = entityManagerFactory.createEntityManager(); - + public ImageAlbumService(EntityManager entityManager) { this.imageAlbumRepository = new ImageAlbumRepository(entityManager); this.tagRepository = new TagRepository(entityManager); } diff --git a/src/main/java/NTNU/IDATT1002/service/ImageService.java b/src/main/java/NTNU/IDATT1002/service/ImageService.java index 1bd1dd7e84ac05ed76030bac69a831800f6329dc..dfcc355f5ca1e3eae211b396191deacbf7e3b437 100644 --- a/src/main/java/NTNU/IDATT1002/service/ImageService.java +++ b/src/main/java/NTNU/IDATT1002/service/ImageService.java @@ -1,13 +1,11 @@ package NTNU.IDATT1002.service; +import NTNU.IDATT1002.filters.ImageFilter; import NTNU.IDATT1002.models.*; import NTNU.IDATT1002.repository.*; -import NTNU.IDATT1002.filters.ImageFilter; import NTNU.IDATT1002.utils.ImageUtil; import NTNU.IDATT1002.utils.MetaDataExtractor; import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.Persistence; import java.io.File; import java.util.ArrayList; import java.util.List; @@ -32,17 +30,13 @@ public class ImageService { /** * Inject entity manager instance to the repositories. */ - public ImageService() { - EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ImageApplication"); - EntityManager entityManager = entityManagerFactory.createEntityManager(); - + public ImageService(EntityManager entityManager) { this.imageRepository = new ImageRepository(entityManager); this.metadataRepository = new MetadataRepository(entityManager); this.tagRepository = new TagRepository(entityManager); this.historgramRepository = new HistorgramRepository(entityManager); this.geoLocatioRepository = new GeoLocatioRepository(entityManager); this.metaDataExtractor = new MetaDataExtractor(); - } /** diff --git a/src/main/java/NTNU/IDATT1002/service/UserService.java b/src/main/java/NTNU/IDATT1002/service/UserService.java index e14166e242b46f8ff208914ec753f484743da50b..0a5046fbbe68d113c89d8810ac6d90b9767c6f19 100644 --- a/src/main/java/NTNU/IDATT1002/service/UserService.java +++ b/src/main/java/NTNU/IDATT1002/service/UserService.java @@ -1,17 +1,13 @@ package NTNU.IDATT1002.service; -import NTNU.IDATT1002.App; import NTNU.IDATT1002.ApplicationState; import NTNU.IDATT1002.models.Login; import NTNU.IDATT1002.models.User; import NTNU.IDATT1002.repository.LoginRepository; import NTNU.IDATT1002.repository.UserRepository; import NTNU.IDATT1002.utils.Authentication; -import org.apache.log4j.helpers.AbsoluteTimeDateFormat; import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.Persistence; import java.util.ArrayList; import java.util.Date; import java.util.Optional; @@ -30,10 +26,7 @@ public class UserService { /** * Inject entity manager instance to the repositories */ - public UserService() { - EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ImageApplication"); - EntityManager entityManager = entityManagerFactory.createEntityManager(); - + public UserService(EntityManager entityManager) { this.loginRepository = new LoginRepository(entityManager); this.userRepository = new UserRepository(entityManager); } diff --git a/src/main/java/NTNU/IDATT1002/utils/MetaDataExtractor.java b/src/main/java/NTNU/IDATT1002/utils/MetaDataExtractor.java index 04236251eef235d91de98c707b13d61e68c1f7a7..7f87611d7bf3ee460178f424398576dd6ccf39b4 100644 --- a/src/main/java/NTNU/IDATT1002/utils/MetaDataExtractor.java +++ b/src/main/java/NTNU/IDATT1002/utils/MetaDataExtractor.java @@ -1,5 +1,6 @@ package NTNU.IDATT1002.utils; +import NTNU.IDATT1002.database.EntityManagerConfig; import NTNU.IDATT1002.models.GeoLocation; import NTNU.IDATT1002.models.Histogram; import NTNU.IDATT1002.repository.GeoLocatioRepository; @@ -11,8 +12,6 @@ import com.drew.metadata.MetadataException; import com.drew.metadata.exif.GpsDirectory; import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.Persistence; import java.io.File; import java.io.IOException; @@ -26,8 +25,7 @@ public class MetaDataExtractor { private HistorgramRepository historgramRepository; public MetaDataExtractor() { - EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ImageApplication"); - EntityManager entityManager = entityManagerFactory.createEntityManager(); + EntityManager entityManager = EntityManagerConfig.getEntityManager(); this.historgramRepository = new HistorgramRepository(entityManager); this.geoLocationRepository = new GeoLocatioRepository(entityManager); diff --git a/src/main/resources/hibernate.properties b/src/main/resources/hibernate.properties new file mode 100644 index 0000000000000000000000000000000000000000..1c3c5a0e157d86a48cb83f91363d52030ca119a5 --- /dev/null +++ b/src/main/resources/hibernate.properties @@ -0,0 +1,10 @@ +# Set this value to true if you want to configure another connection +OVERRIDE_DEFAULT_DB_CONFIG=false + +# These values correspond to database hosted on https://www.digitalocean.com/ +DB_DRIVER=com.mysql.cj.jdbc.Driver +DB_URL=jdbc:mysql://db-mysql-lon1-07155-do-user-7212587-0.a.db.ondigitalocean.com:25060/image_application +DB_USER=doadmin +DB_PASSWORD=s4oxtqu20e8r7tx5 +DB_DIALECT=org.hibernate.dialect.MySQL8Dialect +DB_HBM2DDL=update \ No newline at end of file diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties new file mode 100644 index 0000000000000000000000000000000000000000..f45db84340e0458b08c7bafb5d8bc369d6d6954b --- /dev/null +++ b/src/main/resources/log4j.properties @@ -0,0 +1,14 @@ +# Direct to stdout +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +log4j.appender.stdout.Target=System.out +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n + +# Root logger option +log4j.rootLogger=INFO, stdout + +# Good for troubleshooting +log4j.logger.org.hibernate=INFO + +# Log JDBC parameters +log4j.logger.org.hibernate.type=ALL diff --git a/src/test/resources/META-INF/persistence.xml b/src/test/resources/META-INF/persistence.xml index faa2397fdab90f715b0a4a2f4249fa0e45d454dc..96f44517573251e8b589872d07e3b378481394dc 100644 --- a/src/test/resources/META-INF/persistence.xml +++ b/src/test/resources/META-INF/persistence.xml @@ -30,7 +30,7 @@ <property name="hibernate.use_sql_comments" value="true"/> <!-- Create tables on startup --> - <property name="hibernate.hbm2ddl.auto" value="create" /> + <property name="hibernate.hbm2ddl.auto" value="create-drop" /> </properties> </persistence-unit> </persistence> \ No newline at end of file