From 4ee3ee1cfc346180b1dfbb3ebaee8a3cf1a0b2ab Mon Sep 17 00:00:00 2001 From: BEAUVAIS ANTOINE <antoine.beauvais@etu.unistra.fr> Date: Mon, 20 Sep 2021 22:23:00 +0200 Subject: [PATCH] SQLite database and proper JSON response. --- .gitignore | 3 + build.gradle | 3 + .../unistra/sil/erp/back/DatabaseSystem.java | 40 ++++++++++ .../controller/ApiRetrieveInfoController.java | 23 +++++- .../controller/ApiServerErrorController.java | 22 +++++ .../back/db/DatabaseConnectionException.java | 13 +++ .../sil/erp/back/db/DatabaseInterface.java | 26 ++++++ .../sil/erp/back/db/DatabaseSQLiteImpl.java | 80 +++++++++++++++++++ 8 files changed, 208 insertions(+), 2 deletions(-) create mode 100644 src/main/java/fr/unistra/sil/erp/back/DatabaseSystem.java create mode 100644 src/main/java/fr/unistra/sil/erp/back/api/controller/ApiServerErrorController.java create mode 100644 src/main/java/fr/unistra/sil/erp/back/db/DatabaseConnectionException.java create mode 100644 src/main/java/fr/unistra/sil/erp/back/db/DatabaseInterface.java create mode 100644 src/main/java/fr/unistra/sil/erp/back/db/DatabaseSQLiteImpl.java diff --git a/.gitignore b/.gitignore index c2065bc..2dd36c8 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,6 @@ out/ ### VS Code ### .vscode/ + +### SQLite ### +dev.db \ No newline at end of file diff --git a/build.gradle b/build.gradle index 2bd8707..ac86de9 100644 --- a/build.gradle +++ b/build.gradle @@ -14,6 +14,9 @@ repositories { } dependencies { + + implementation 'org.xerial:sqlite-jdbc:3.36.0.3' + implementation 'org.springframework.boot:spring-boot-starter-web' providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' testImplementation 'org.springframework.boot:spring-boot-starter-test' diff --git a/src/main/java/fr/unistra/sil/erp/back/DatabaseSystem.java b/src/main/java/fr/unistra/sil/erp/back/DatabaseSystem.java new file mode 100644 index 0000000..321f119 --- /dev/null +++ b/src/main/java/fr/unistra/sil/erp/back/DatabaseSystem.java @@ -0,0 +1,40 @@ +/* + * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B + * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html + */ +package fr.unistra.sil.erp.back; + +import fr.unistra.sil.erp.back.db.DatabaseConnectionException; +import fr.unistra.sil.erp.back.db.DatabaseInterface; +import fr.unistra.sil.erp.back.db.DatabaseSQLiteImpl; + +/** + * Manages the database implementation to use. + * @author BEAUVAIS ANTOINE <antoine.beauvais@etu.unistra.fr> + */ +public class DatabaseSystem { + + /** + * The database implementation object. + */ + private static DatabaseInterface instance; + + /** + * Returns the database implementation in use.In order to change the + * implementation, simply change this method's implementation construction + * to the desired one. + * + * @return the instance of the database implementation. + * @throws fr.unistra.sil.erp.back.db.DatabaseConnectionException + */ + public static DatabaseInterface getInstance() throws DatabaseConnectionException + { + if(DatabaseSystem.instance == null) + DatabaseSystem.instance = new DatabaseSQLiteImpl(); + + if(DatabaseSystem.instance == null) + throw new DatabaseConnectionException(); + + return DatabaseSystem.instance; + } +} diff --git a/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiRetrieveInfoController.java b/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiRetrieveInfoController.java index aa3e6e9..73fcd23 100644 --- a/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiRetrieveInfoController.java +++ b/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiRetrieveInfoController.java @@ -4,7 +4,13 @@ */ package fr.unistra.sil.erp.back.api.controller; +import fr.unistra.sil.erp.back.DatabaseSystem; import fr.unistra.sil.erp.back.api.model.Item; +import fr.unistra.sil.erp.back.db.DatabaseConnectionException; +import fr.unistra.sil.erp.back.db.DatabaseInterface; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -20,8 +26,21 @@ public class ApiRetrieveInfoController { * @return an Item. */ @GetMapping("/erp-back/api/v1/retrieveInfo") - public Item retrieveInfo() + public List<Item> retrieveInfo() { - return new Item(1, "Test", 1.0, 0.5); + DatabaseInterface db; + try { + db = DatabaseSystem.getInstance(); + } catch (DatabaseConnectionException ex) { + Logger.getLogger(ApiRetrieveInfoController.class.getName()).log( + Level.SEVERE, "Database failure.", ex); + throw new ApiServerErrorController("Connection to database failed"); + } + + List<Item> res = db.getAllItems(); + if(res == null) + throw new ApiServerErrorController("Failed to retrieve list."); + + return res; } } diff --git a/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiServerErrorController.java b/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiServerErrorController.java new file mode 100644 index 0000000..882f5f2 --- /dev/null +++ b/src/main/java/fr/unistra/sil/erp/back/api/controller/ApiServerErrorController.java @@ -0,0 +1,22 @@ +/* + * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B + * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html + */ +package fr.unistra.sil.erp.back.api.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ResponseStatus; + +/** + * Returns HTTP 500 error page. + * @author BEAUVAIS ANTOINE <antoine.beauvais@etu.unistra.fr> + */ +@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) +public class ApiServerErrorController extends RuntimeException { + + public ApiServerErrorController(String errMsg) + { + super(errMsg); + } + +} diff --git a/src/main/java/fr/unistra/sil/erp/back/db/DatabaseConnectionException.java b/src/main/java/fr/unistra/sil/erp/back/db/DatabaseConnectionException.java new file mode 100644 index 0000000..1b1598f --- /dev/null +++ b/src/main/java/fr/unistra/sil/erp/back/db/DatabaseConnectionException.java @@ -0,0 +1,13 @@ +/* + * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B + * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html + */ +package fr.unistra.sil.erp.back.db; + +/** + * + * @author BEAUVAIS ANTOINE <antoine.beauvais@etu.unistra.fr> + */ +public class DatabaseConnectionException extends Exception { + +} diff --git a/src/main/java/fr/unistra/sil/erp/back/db/DatabaseInterface.java b/src/main/java/fr/unistra/sil/erp/back/db/DatabaseInterface.java new file mode 100644 index 0000000..7248a26 --- /dev/null +++ b/src/main/java/fr/unistra/sil/erp/back/db/DatabaseInterface.java @@ -0,0 +1,26 @@ +/* + * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B + * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html + */ +package fr.unistra.sil.erp.back.db; + +import fr.unistra.sil.erp.back.api.model.Item; +import java.util.List; + +/** + * Standard interface for database implementations. + * + * This interface allows the application to be able to use different + * database systems (CSV, SQLite, MySQL...) by simply switching + * implementations. + * @author BEAUVAIS ANTOINE <antoine.beauvais@etu.unistra.fr> + */ +public interface DatabaseInterface { + + /** + * Returns the list of all items. + * @return the list of all items. + */ + public List<Item> getAllItems(); + +} diff --git a/src/main/java/fr/unistra/sil/erp/back/db/DatabaseSQLiteImpl.java b/src/main/java/fr/unistra/sil/erp/back/db/DatabaseSQLiteImpl.java new file mode 100644 index 0000000..dfdabaf --- /dev/null +++ b/src/main/java/fr/unistra/sil/erp/back/db/DatabaseSQLiteImpl.java @@ -0,0 +1,80 @@ +/* + * CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B + * https://cecill.info/licences/Licence_CeCILL-B_V1-fr.html + */ +package fr.unistra.sil.erp.back.db; + +import fr.unistra.sil.erp.back.api.model.Item; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author BEAUVAIS ANTOINE <antoine.beauvais@etu.unistra.fr> + */ +public class DatabaseSQLiteImpl implements DatabaseInterface { + + private static final String CONNECTION_URL = "jdbc:sqlite:dev.db"; + private static final String SQL_GETALLITEMS = + "SELECT ref, name, price, subscriberPrice FROM items"; + + private Connection conn; + + public DatabaseSQLiteImpl() + { + try { + conn = DriverManager.getConnection(CONNECTION_URL); + } catch (SQLException ex) { + Logger.getLogger(DatabaseSQLiteImpl.class.getName()).log( + Level.SEVERE, "Failed to connect to SQLite file.", ex); + } + } + + private ResultSet query(String query) + { + Statement stmt; + ResultSet rs; + try { + stmt = this.conn.createStatement(); + rs = stmt.executeQuery(SQL_GETALLITEMS); + } catch (SQLException ex) { + Logger.getLogger(DatabaseSQLiteImpl.class.getName()).log( + Level.SEVERE, "Failed to run query: " + query, ex); + return null; + } + + return rs; + } + + @Override + public List<Item> getAllItems() { + ResultSet rs = query(SQL_GETALLITEMS); + if(rs == null) + return null; + + List<Item> res = new ArrayList<>(); + try { + while(rs.next()) + { + Item item = new Item(rs.getInt("ref"), rs.getString("name"), + rs.getDouble("price"), + rs.getDouble("subscriberPrice")); + res.add(item); + } + } catch (SQLException ex) { + Logger.getLogger(DatabaseSQLiteImpl.class.getName()).log( + Level.SEVERE, null, ex); + return null; + } + + return res; + } + +} -- GitLab