From 0ee00133d1772f3f4c47d6d89967bc2cf720c132 Mon Sep 17 00:00:00 2001 From: Martin Goik <goik@hdm-stuttgart.de> Date: Tue, 3 Nov 2015 17:36:48 +0100 Subject: [PATCH] New persistence handler --- P/Sda1/persistencehandler/.gitignore | 5 + P/Sda1/persistencehandler/pom.xml | 31 ++++ .../mi/sda1/persistencehandler/DbProps.java | 22 +++ .../PersistenceHandler.java | 167 ++++++++++++++++++ .../persistencehandler/database.properties | 3 + .../src/main/resources/log4j2.xml | 21 +++ .../src/main/resources/schema.sql | 6 + .../sda1/persistencehandler/PersistTest.java | 12 ++ 8 files changed, 267 insertions(+) create mode 100644 P/Sda1/persistencehandler/.gitignore create mode 100644 P/Sda1/persistencehandler/pom.xml create mode 100644 P/Sda1/persistencehandler/src/main/java/de/hdm_stuttgart/mi/sda1/persistencehandler/DbProps.java create mode 100644 P/Sda1/persistencehandler/src/main/java/de/hdm_stuttgart/mi/sda1/persistencehandler/PersistenceHandler.java create mode 100644 P/Sda1/persistencehandler/src/main/java/de/hdm_stuttgart/mi/sda1/persistencehandler/database.properties create mode 100644 P/Sda1/persistencehandler/src/main/resources/log4j2.xml create mode 100644 P/Sda1/persistencehandler/src/main/resources/schema.sql create mode 100644 P/Sda1/persistencehandler/src/test/java/de/hdm_stuttgart/mi/sda1/persistencehandler/PersistTest.java diff --git a/P/Sda1/persistencehandler/.gitignore b/P/Sda1/persistencehandler/.gitignore new file mode 100644 index 000000000..660be2a5f --- /dev/null +++ b/P/Sda1/persistencehandler/.gitignore @@ -0,0 +1,5 @@ +.project +.classpath +/.settings/ +/target/ +A1.log \ No newline at end of file diff --git a/P/Sda1/persistencehandler/pom.xml b/P/Sda1/persistencehandler/pom.xml new file mode 100644 index 000000000..8511f6410 --- /dev/null +++ b/P/Sda1/persistencehandler/pom.xml @@ -0,0 +1,31 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <parent> + <groupId>de.hdm-stuttgart.mi</groupId> + <artifactId>lecturenotes-pom</artifactId> + <version>1.0</version> + + <relativePath>../../pom.xml</relativePath> + </parent> + + <groupId>de.hdm-stuttgart.mi.sda1</groupId> + <artifactId>persistencehandler</artifactId> + <version>0.8</version> + <packaging>jar</packaging> + + <name>Persistencehandler</name> + <url>http://www.mi.hdm-stuttgart.de/freedocs</url> + + <dependencies> + + <dependency> + <groupId>mysql</groupId> + <artifactId>mysql-connector-java</artifactId> + <version>${mysql.mysql-connector-java.version}</version> + </dependency> + + </dependencies> + +</project> diff --git a/P/Sda1/persistencehandler/src/main/java/de/hdm_stuttgart/mi/sda1/persistencehandler/DbProps.java b/P/Sda1/persistencehandler/src/main/java/de/hdm_stuttgart/mi/sda1/persistencehandler/DbProps.java new file mode 100644 index 000000000..c5ad2bc9c --- /dev/null +++ b/P/Sda1/persistencehandler/src/main/java/de/hdm_stuttgart/mi/sda1/persistencehandler/DbProps.java @@ -0,0 +1,22 @@ +package de.hdm_stuttgart.mi.sda1.persistencehandler; + +import java.util.MissingResourceException; +import java.util.ResourceBundle; + +public class DbProps { + private static final String BUNDLE_NAME = "sda.jdbc.intro.v1.database"; + + private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle + .getBundle(BUNDLE_NAME); + + private DbProps() { + } + + public static String getString(String key) { + try { + return RESOURCE_BUNDLE.getString(key); + } catch (MissingResourceException e) { + return '!' + key + '!'; + } + } +} diff --git a/P/Sda1/persistencehandler/src/main/java/de/hdm_stuttgart/mi/sda1/persistencehandler/PersistenceHandler.java b/P/Sda1/persistencehandler/src/main/java/de/hdm_stuttgart/mi/sda1/persistencehandler/PersistenceHandler.java new file mode 100644 index 000000000..f436337b3 --- /dev/null +++ b/P/Sda1/persistencehandler/src/main/java/de/hdm_stuttgart/mi/sda1/persistencehandler/PersistenceHandler.java @@ -0,0 +1,167 @@ +package de.hdm_stuttgart.mi.sda1.persistencehandler; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.sql.Statement; + +/** + * Handle database communication. There are two + * distinct internal states <strong>disconnected</strong> and <strong>connected</strong>, see + * {@link #isConnected()}. These two states may be toggled by invoking + * {@link #connect()} and {@link #disconnect()} respectively. + * + * The following snippet illustrates the intended usage: + * <pre> public static void main(String[] args) { + final PersistenceHandler ph = new PersistenceHandler(); + if (ph.connect()) { + if (!ph.add("Jim", "jim@foo.com")) { + System.err.println("Insert Error:" + ph.getErrorMessage()); + } + } else { + System.err.println("Connect error:" + ph.getErrorMessage()); + } + }</pre> + * + * @author goik + */ +public class PersistenceHandler { + + Connection conn = null; + Statement stmt = null; + + String errorMessage = null; + + /** + * New instances are in <strong>disconnected</strong> state. See {@link #isConnected()} + */ + public PersistenceHandler() {/* only present here to supply javadoc comment */} + + /** + * Inserting a (name, email) record into the database server. In case of + * errors corresponding messages may subsequently be retrieved by calling + * {@link #getErrorMessage()}. + * + * <dl> + * <dt><b>Precondition:</b></dt> + * <dd>must be in <strong>connected</strong> state, see {@link #isConnected()}</dd> + * </dl> + * + * @param name A person's name + * @param email A person's email address + * + * @return true if the current data record has been successfully inserted + * into the database server. false in case of error(s). + */ + public boolean add(final String name, final String email){ + final String sql = "INSERT INTO Person VALUES('" + name + "', '" + + email + "')"; + try { + stmt.executeUpdate(sql); + return true; + } catch (SQLException e) { + errorMessage = "Unable to execute '" + sql + "': '" + e.getMessage() + "'"; + return false; + } + } + + /** + * Retrieving error messages in case a call to {@link #add(String, String)}, + * {@link #connect()}, or {@link #disconnect()} yields an error. + * + * @return the error explanation corresponding to the latest failed + * operation, null if no error yet occurred. + */ + public String getErrorMessage() { + return errorMessage; + } + + /** + * Open a connection to a database server. + * + * <dl> + * <dt><b>Precondition:</b></dt> + * <dd>must be in <strong>disconnected</strong> state, see {@link #isConnected()}</dd> + * + * <dt><b>Precondition:</b></dt> + * <dd>The following properties must be set: + * <pre>PersistenceHandler.jdbcUrl=jdbc:mysql://localhost:3306/hdm +PersistenceHandler.password=XYZ +PersistenceHandler.username=foo</pre> + * </dd> + * </dl> + * + * @return true if connecting was successful + */ + public boolean connect () { + try { + conn = DriverManager.getConnection( + DbProps.getString("PersistenceHandler.jdbcUrl"), + DbProps.getString("PersistenceHandler.username"), + DbProps.getString("PersistenceHandler.password")); + try { + stmt = conn.createStatement(); + return true; + } catch (SQLException e) { + errorMessage = "Connection opened but Statement creation failed:\"" + e.getMessage() + "\"."; + try { + conn.close(); + } catch (SQLException ee) { + errorMessage += "Closing connection failed:\"" + e.getMessage() + "\"."; + } + conn = null; + } + + } catch (SQLException e) { + errorMessage = "Unable to open connection:\"" + e.getMessage() + "\"."; + } + return false; + } + + /** + * Close a connection to a database server and clean up JDBC related resources + * + * Error messages in case of failure may subsequently be retrieved by + * calling {@link #getErrorMessage()}. + * + * <dl> + * <dt><b>Precondition:</b></dt> + * <dd>must be in <strong>connected</strong> state, see {@link #isConnected()}</dd> + * </dl> + * + * @return true if disconnecting was successful, false in case error(s) occur. + */ + public boolean disconnect() { + boolean resultStatus = true; + final StringBuffer messageCollector = new StringBuffer(); + try { + stmt.close(); + } catch (SQLException e) { + resultStatus = false; + messageCollector.append("Unable to close Statement:\"" + e.getMessage() + "\"."); + } + stmt = null; + try { + conn.close(); + } catch (SQLException e) { + resultStatus = false; + messageCollector.append("Unable to close connection:\"" + e.getMessage() + "\"."); + } + conn = null; + if (!resultStatus) { + errorMessage = messageCollector.toString(); + } + return resultStatus; + } + + /** + * An instance can either be in <strong>connected</strong> or <strong>disconnected</strong> state. The + * state can be toggled by invoking {@link #connect()} or + * {@link #disconnect()} respectively. + * + * @return true if connected, false otherwise + */ + public boolean isConnected() { + return null != conn; + } +} \ No newline at end of file diff --git a/P/Sda1/persistencehandler/src/main/java/de/hdm_stuttgart/mi/sda1/persistencehandler/database.properties b/P/Sda1/persistencehandler/src/main/java/de/hdm_stuttgart/mi/sda1/persistencehandler/database.properties new file mode 100644 index 000000000..cce27557f --- /dev/null +++ b/P/Sda1/persistencehandler/src/main/java/de/hdm_stuttgart/mi/sda1/persistencehandler/database.properties @@ -0,0 +1,3 @@ +PersistenceHandler.jdbcUrl=jdbc:mysql://localhost:3306/hdm +PersistenceHandler.username=hdmuser +PersistenceHandler.password=XYZ diff --git a/P/Sda1/persistencehandler/src/main/resources/log4j2.xml b/P/Sda1/persistencehandler/src/main/resources/log4j2.xml new file mode 100644 index 000000000..eda4f3b0d --- /dev/null +++ b/P/Sda1/persistencehandler/src/main/resources/log4j2.xml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Configuration> + <Appenders> + <File name="A1" fileName="A1.log" append="false"> + <PatternLayout pattern="%t %-5p %c{2} - %m%n"/> + </File> + <Console name="STDOUT" target="SYSTEM_OUT"> + <PatternLayout pattern="%C{2} (%F:%L) - %m%n"/> + </Console> + </Appenders> + <Loggers> + + <!-- You my want to define class or package level per-logger rules --> + <Logger name="de.hdm_stuttgart.mi.sda1.catalog2sax.App" level="debug"> + <AppenderRef ref="A1"/> + </Logger> + <Root level="debug"> + <AppenderRef ref="STDOUT"/> + </Root> + </Loggers> +</Configuration> \ No newline at end of file diff --git a/P/Sda1/persistencehandler/src/main/resources/schema.sql b/P/Sda1/persistencehandler/src/main/resources/schema.sql new file mode 100644 index 000000000..2821a2e90 --- /dev/null +++ b/P/Sda1/persistencehandler/src/main/resources/schema.sql @@ -0,0 +1,6 @@ +DROP TABLE IF EXISTS Person; + +CREATE TABLE Person ( + name char(80) + ,email CHAR(20) UNIQUE +); diff --git a/P/Sda1/persistencehandler/src/test/java/de/hdm_stuttgart/mi/sda1/persistencehandler/PersistTest.java b/P/Sda1/persistencehandler/src/test/java/de/hdm_stuttgart/mi/sda1/persistencehandler/PersistTest.java new file mode 100644 index 000000000..1eee7ee94 --- /dev/null +++ b/P/Sda1/persistencehandler/src/test/java/de/hdm_stuttgart/mi/sda1/persistencehandler/PersistTest.java @@ -0,0 +1,12 @@ +package de.hdm_stuttgart.mi.sda1.persistencehandler; + +/** + * Testing persisting objects. + * + */ +public class PersistTest { + + + + +} -- GitLab