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