Ver código fonte

Utilisation fichier properties pour db + externalisation gestion table db

Arthur Brandao 5 anos atrás
pai
commit
bd1f167e25

+ 2 - 0
src/database.properties

@@ -0,0 +1,2 @@
+jdbc.url=jdbc:derby:microfolie;create=true
+database.manager=microfolie.db.MicrofolieDatabase

+ 24 - 5
src/db/Database.java

@@ -9,6 +9,7 @@ import java.util.logging.Logger;
 
 import db.mapper.Mapper;
 
+import java.lang.reflect.InvocationTargetException;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.PreparedStatement;
@@ -34,7 +35,7 @@ public class Database {
 		    throw new IllegalStateException("Unable to connect to the database", e);
 		}
 		try {
-			db = DriverManager.getConnection("jdbc:derby:microfolie;create=true");
+			db = DriverManager.getConnection(DatabaseProperties.get("jdbc.url"));
 		} catch (SQLException e) {
 			LOGGER.warning(e.getMessage());
 			throw new IllegalStateException("Unable to connect to the database", e);
@@ -58,12 +59,16 @@ public class Database {
 			return;
 		}
 		LOGGER.info("Creating table");
-		ManageTable.create.forEach((table, sql) -> {
+		ManageDatabase md = getDatabaseManager();
+		md.create().forEach((table, sql) -> {
 			LOGGER.info("Creating table " + table);
 			execute(sql);
 		});
-		LOGGER.info("Add mock");
-		ManageTable.mock.forEach(req -> execute(req));
+		List<String> content = md.content();
+		if(content != null) {
+			LOGGER.info("Add content");
+			content.forEach(req -> execute(req));
+		}
 	}
 	
 	public static void unset() {
@@ -71,7 +76,8 @@ public class Database {
 			return;
 		}
 		LOGGER.info("Dropping table");
-		ManageTable.drop.forEach((table, sql) -> {
+		ManageDatabase md = getDatabaseManager();
+		md.drop().forEach((table, sql) -> {
 			LOGGER.info("Dropping table " + table);
 			execute(sql);
 		});
@@ -172,5 +178,18 @@ public class Database {
 	public static Connection getDb() {
 		return db;
 	}
+	
+	private static ManageDatabase getDatabaseManager() {
+		try {
+			String className = DatabaseProperties.get("database.manager");
+			Class<?> clazz = Class.forName(className);
+			ManageDatabase md = (ManageDatabase) clazz.getMethod("getInstance").invoke(null);
+			return md;
+		} catch (ClassNotFoundException e) {
+			throw new IllegalStateException("Unable to find Database Manager Class", e);
+		} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException | SecurityException e) {
+			throw new IllegalStateException("Database Manager Class is not a child of ManagaDatabase Class or no getInstance method found", e);
+		}
+	}
 
 }

+ 21 - 0
src/db/DatabaseProperties.java

@@ -0,0 +1,21 @@
+package db;
+
+import java.io.IOException;
+import java.util.Properties;
+
+public class DatabaseProperties {
+	
+	private static Properties properties = new Properties(); 
+	static {
+		try {
+			properties.load(DatabaseProperties.class.getResourceAsStream("/database.properties"));
+		} catch (IOException e) {
+			throw new IllegalStateException("Unable to find database.properties", e);
+		}
+	}
+	
+	public static String get(String key) {
+		return properties.getProperty(key);
+	}
+
+}

+ 18 - 0
src/db/ManageDatabase.java

@@ -0,0 +1,18 @@
+package db;
+
+import java.util.List;
+import java.util.Map;
+
+public abstract class ManageDatabase {
+	
+	protected ManageDatabase() {
+		// Constructeur privé pour singelton
+	}
+	
+	public abstract Map<String, String> create();
+	
+	public abstract Map<String, String> drop();
+	
+	public abstract List<String> content();
+
+}

+ 31 - 6
src/db/ManageTable.java → src/microfolie/db/MicrofolieDatabase.java

@@ -1,21 +1,24 @@
-package db;
+package microfolie.db;
 
 import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
-public class ManageTable {
+import db.ManageDatabase;
+
+public class MicrofolieDatabase extends ManageDatabase {
 	
-	public final static Map<String, String> create = new LinkedHashMap<>();
-	public final static Map<String, String> drop = new LinkedHashMap<>();
-	public final static List<String> mock = new ArrayList<>();
+	private static MicrofolieDatabase instance;
+	private final static Map<String, String> create = new LinkedHashMap<>();
+	private final static Map<String, String> drop = new LinkedHashMap<>();
+	private final static List<String> mock = new ArrayList<>();
 	static {
 		iniCreate();
 		iniDrop();
 		iniMock();
 	}
-	
+
 	private static void iniCreate() {
 		create.put("Espace", "CREATE TABLE Espace ("
 				+ "ID BIGINT NOT NULL PRIMARY KEY GENERATED ALWAYS AS IDENTITY,"
@@ -76,4 +79,26 @@ public class ManageTable {
 		mock.add("Insert into Usager(NOM, PRENOM, DATEDENAISSANCE, EMAIL, TELEPHONE, CONTACTURGENCE, CODE, SCOLAIRE, DESCRIPTION, VILLE, ECOLE) Values('Brandao', 'Arthur', '1996-10-21', 'ab@email.fr', '0605040302', 'Nop', 'LCOM', TRUE, 'Desc', 1, 4)");
 	}
 
+	@Override
+	public Map<String, String> create() {
+		return create;
+	}
+
+	@Override
+	public Map<String, String> drop() {
+		return drop;
+	}
+
+	@Override
+	public List<String> content() {
+		return mock;
+	}
+	
+	public static MicrofolieDatabase getInstance() {
+		if (instance == null) {
+			instance = new MicrofolieDatabase();
+		}
+		return instance;
+	}
+	
 }

+ 1 - 1
src/servlets/TestDb.java

@@ -13,7 +13,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import db.Database;
-import db.ManageTable;
+import db.ManageDatabase;
 import db.annotation.DbTable;
 import db.table.EcoleTable;
 import db.table.EspaceTable;