From b9e0eb111512950a41d93b3376961c4a75e70009 Mon Sep 17 00:00:00 2001
From: Martin Goik <goik@hdm-stuttgart.de>
Date: Wed, 21 Jan 2015 19:26:14 +0100
Subject: [PATCH] New exercise

---
 Sda1/Etest/rdbms2catalog/.gitignore           |  5 +
 Sda1/Etest/rdbms2catalog/Schema/schema.sql    | 33 +++++++
 Sda1/Etest/rdbms2catalog/pom.xml              | 97 +++++++++++++++++++
 .../mi/sda1/sql2catalog/Helper.java           | 18 ++++
 .../mi/sda1/sql2catalog/Messages.java         | 22 +++++
 .../mi/sda1/sql2catalog/Rdbms2Xml.java        | 81 ++++++++++++++++
 .../mi/sda1/sql2catalog/RdbmsAccess.java      | 63 ++++++++++++
 .../mi/sda1/sql2catalog/messages.properties   | 11 +++
 .../src/main/resources/log4j2.xml             | 21 ++++
 9 files changed, 351 insertions(+)
 create mode 100644 Sda1/Etest/rdbms2catalog/.gitignore
 create mode 100644 Sda1/Etest/rdbms2catalog/Schema/schema.sql
 create mode 100644 Sda1/Etest/rdbms2catalog/pom.xml
 create mode 100644 Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/Helper.java
 create mode 100644 Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/Messages.java
 create mode 100644 Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/Rdbms2Xml.java
 create mode 100644 Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/RdbmsAccess.java
 create mode 100644 Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/messages.properties
 create mode 100644 Sda1/Etest/rdbms2catalog/src/main/resources/log4j2.xml

diff --git a/Sda1/Etest/rdbms2catalog/.gitignore b/Sda1/Etest/rdbms2catalog/.gitignore
new file mode 100644
index 000000000..660be2a5f
--- /dev/null
+++ b/Sda1/Etest/rdbms2catalog/.gitignore
@@ -0,0 +1,5 @@
+.project
+.classpath
+/.settings/
+/target/
+A1.log
\ No newline at end of file
diff --git a/Sda1/Etest/rdbms2catalog/Schema/schema.sql b/Sda1/Etest/rdbms2catalog/Schema/schema.sql
new file mode 100644
index 000000000..d08f17306
--- /dev/null
+++ b/Sda1/Etest/rdbms2catalog/Schema/schema.sql
@@ -0,0 +1,33 @@
+DROP TABLE IF EXISTS Description;
+DROP TABLE IF EXISTS StudyCourse;
+
+CREATE TABLE StudyCourse (
+   id INTEGER NOT NULL PRIMARY KEY
+  ,name VARCHAR(255) NOT NULL
+  ,shortName CHAR(3)
+  ,program CHAR(1) /* Bachelor or Master program? */
+  ,CHECK (program IN ('B', 'M')) /* Mysql does not really honour CHECK constraints, but pretend it does! */
+) ENGINE=InnoDB;
+
+
+CREATE TABLE Student (
+   id INTEGER NOT NULL PRIMARY KEY
+  ,fullName VARCHAR(255)
+  ,email VARCHAR(255) NOT NULL UNIQUE
+  ,studyCourse INTEGER
+  ,FOREIGN KEY(studyCourse) REFERENCES StudyCourse(id)
+) ENGINE=InnoDB;
+
+-- example data corresponding to university.xml --
+
+INSERT INTO StudyCourse VALUES (1, 'Mobile Media', 'MMB', 'B');
+INSERT INTO StudyCourse VALUES (2, 'Computer Science in Media', NULL, 'M');
+
+
+INSERT INTO Student VALUES(33, 'Jim Bone', 'bone@foo.org', NULL);
+INSERT INTO Student VALUES(40, 'Tracy Adams', 'adams@security.com', 2);
+
+-- Selects --
+
+SELECT * FROM Student;
+SELECT * FROM StudyCourse;
diff --git a/Sda1/Etest/rdbms2catalog/pom.xml b/Sda1/Etest/rdbms2catalog/pom.xml
new file mode 100644
index 000000000..a90681ea4
--- /dev/null
+++ b/Sda1/Etest/rdbms2catalog/pom.xml
@@ -0,0 +1,97 @@
+<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>
+
+	<groupId>de.hdm-stuttgart.mi.sda1</groupId>
+	<artifactId>rdbms2catalog</artifactId>
+	<version>0.8</version>
+	<packaging>jar</packaging>
+
+	<name>rdbms2catalog</name>
+
+	<url>http://www.mi.hdm-stuttgart.de/freedocs</url>
+
+	<properties>
+		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+	</properties>
+
+	<dependencies>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.11</version>
+			<scope>test</scope>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.logging.log4j</groupId>
+			<artifactId>log4j-api</artifactId>
+			<version>2.1</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.logging.log4j</groupId>
+			<artifactId>log4j-core</artifactId>
+			<version>2.1</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.jdom</groupId>
+			<artifactId>jdom2</artifactId>
+			<version>2.0.5</version>
+		</dependency>
+
+		<dependency>
+			<groupId>mysql</groupId>
+			<artifactId>mysql-connector-java</artifactId>
+			<version>5.1.34</version>
+		</dependency>
+
+	</dependencies>
+
+	<build>
+		<plugins>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<version>3.1</version>
+				<configuration>
+					<source>1.8</source>
+					<target>1.8</target>
+				</configuration>
+			</plugin>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-javadoc-plugin</artifactId>
+				<version>2.10.1</version>
+				<configuration />
+			</plugin>
+
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-shade-plugin</artifactId>
+				<version>2.3</version>
+				<configuration>
+					<transformers>
+						<transformer
+							implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
+							<manifestEntries>
+								<Main-Class>de.hdm_stuttgart.mi.sda1.catalog2sax.App</Main-Class>
+							</manifestEntries>
+						</transformer>
+					</transformers>
+				</configuration>
+				<executions>
+					<execution>
+						<phase>package</phase>
+						<goals>
+							<goal>shade</goal>
+						</goals>
+					</execution>
+				</executions>
+			</plugin>
+
+		</plugins>
+	</build>
+</project>
diff --git a/Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/Helper.java b/Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/Helper.java
new file mode 100644
index 000000000..f78795876
--- /dev/null
+++ b/Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/Helper.java
@@ -0,0 +1,18 @@
+package de.hdm_stuttgart.mi.sda1.sql2catalog;
+
+/**
+ * Project wide helper methods
+ *
+ */
+public class Helper {
+   /**
+    * Write message to stderr and exit with given error code
+    * @param errMsg
+    * @param errorCode
+    */
+   public static void exitWithErrorMessage(final String errMsg, int errorCode) {
+      System.err.println(errMsg);
+      System.exit(errorCode);
+   }
+
+}
diff --git a/Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/Messages.java b/Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/Messages.java
new file mode 100644
index 000000000..781829729
--- /dev/null
+++ b/Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/Messages.java
@@ -0,0 +1,22 @@
+package de.hdm_stuttgart.mi.sda1.sql2catalog;
+
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+
+public class Messages {
+   private static final String BUNDLE_NAME = "de.hdm_stuttgart.mi.sda1.sql2catalog.messages"; //$NON-NLS-1$
+
+   private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle
+         .getBundle(BUNDLE_NAME);
+
+   private Messages() {
+   }
+
+   public static String getString(String key) {
+      try {
+         return RESOURCE_BUNDLE.getString(key);
+      } catch (MissingResourceException e) {
+         return '!' + key + '!';
+      }
+   }
+}
diff --git a/Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/Rdbms2Xml.java b/Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/Rdbms2Xml.java
new file mode 100644
index 000000000..31ebb18b9
--- /dev/null
+++ b/Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/Rdbms2Xml.java
@@ -0,0 +1,81 @@
+package de.hdm_stuttgart.mi.sda1.sql2catalog;
+
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+import org.jdom2.Element;
+import org.jdom2.output.Format;
+import org.jdom2.output.XMLOutputter;
+import org.xml.sax.SAXException;
+
+/**
+ * A simple SAX parser demo
+ * 
+ */
+public class Rdbms2Xml {
+   private static final Logger log = LogManager.getLogger(Rdbms2Xml.class);
+
+   /**
+    * @param args
+    *           Unused
+    * @throws SAXException
+    * @throws ParserConfigurationException
+    * @throws IOException
+    */
+   public static void main(String[] args) throws ParserConfigurationException,
+         SAXException, IOException {
+
+
+      
+      // Register Driver
+      final String sqlDriverClassName = Messages.getString("Xml2Rdbms.jdbcDriverName"); 
+      try {
+         Class.forName(sqlDriverClassName);
+      } catch (ClassNotFoundException e) {
+         Helper.exitWithErrorMessage(Messages.getString("Xml2Rdbms.errMsgUnableRegisterDriverClass") + sqlDriverClassName + "'", 1);
+      }
+
+
+      // Opening a JDBC connection
+      // 
+      Connection conn = null;
+      
+      final String jdbcConnectionUrl = Messages.getString("Xml2Rdbms.jdbcUrl"); 
+      final String userName = Messages.getString("Xml2Rdbms.jdbcUser"); 
+      try {
+         conn = DriverManager.getConnection(jdbcConnectionUrl, userName, Messages.getString("Xml2Rdbms.jdbcPasswd")); 
+      } catch (SQLException e) {
+         Helper.exitWithErrorMessage(Messages.getString("Xml2Rdbms.errMsgUnableToConnect") + userName + "' to '" + 
+               jdbcConnectionUrl + "'", 1); 
+      }
+      
+      RdbmsAccess rdbmsAccess = null;
+      try {
+         rdbmsAccess = new RdbmsAccess(conn);
+      } catch (SQLException e) {
+         Helper.exitWithErrorMessage(Messages.getString("Xml2Rdbms.errMsgUnableInitDataInsert"), 1); 
+      }
+      
+      final Element universityElement = new Element("university");
+      final Element studyCourses = new Element("studyCourses");
+      universityElement.addContent(studyCourses);
+      final Element students = new Element("students");
+      
+      try {
+         rdbmsAccess.appendProducts(universityElement);
+      } catch (SQLException e) {
+         Helper.exitWithErrorMessage("Unable to read database:" + e.getLocalizedMessage(), 1);
+      }
+      
+      // Write XML content to standard output
+      XMLOutputter outputter = new XMLOutputter(Format.getPrettyFormat());
+      outputter.output(universityElement, System.out);
+   }
+   
+}
diff --git a/Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/RdbmsAccess.java b/Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/RdbmsAccess.java
new file mode 100644
index 000000000..d13fc1070
--- /dev/null
+++ b/Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/RdbmsAccess.java
@@ -0,0 +1,63 @@
+package de.hdm_stuttgart.mi.sda1.sql2catalog;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.jdom2.Element;
+
+/**
+ * Reading product data
+ *
+ */
+public class RdbmsAccess {
+	
+	final PreparedStatement selectProduct, selectDescription;
+
+	/**
+	 * @param conn Destination RDBMS
+	 * @throws SQLException 
+	 */
+	public RdbmsAccess(final Connection conn) throws SQLException {
+	   conn.setAutoCommit(false);
+	   selectProduct = conn.prepareStatement("SELECT * FROM Product");
+	   selectDescription = conn.prepareStatement("SELECT * FROM Description WHERE product = ? ORDER BY orderIndex");
+	}
+	
+	public void appendProducts(final Element root) throws SQLException {
+	   final ResultSet products = selectProduct.executeQuery();
+	   
+	   while (products.next()) {
+	      final int productId = products.getInt("id");
+	      final Element productElement = new Element("product");
+	      root.addContent(productElement);
+	      productElement.setAttribute("id", "" + productId);
+	      
+	      final Element nameElement = new Element("name");
+	      productElement.addContent(nameElement);
+	      nameElement.addContent(products.getString("name"));
+	      
+         addDescriptions(productId, productElement);
+
+         final int productAge = products.getInt("age");
+	      if (!products.wasNull()) {
+	         final Element ageElement = new Element("age");
+	         productElement.addContent(ageElement);
+	         ageElement.addContent("" + productAge);
+	      }
+	   }
+      products.close();
+	}
+	
+	private void addDescriptions(final int productId, final Element productElement) throws SQLException {
+	   selectDescription.setInt(1, productId);
+	   final ResultSet descriptions = selectDescription.executeQuery();
+	   while (descriptions.next()) {
+	      final Element descriptionElement = new Element("description");
+	      productElement.addContent(descriptionElement);
+	      descriptionElement.addContent(descriptions.getString("text"));
+	   }
+	   descriptions.close();
+	}
+}
diff --git a/Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/messages.properties b/Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/messages.properties
new file mode 100644
index 000000000..a183dcc38
--- /dev/null
+++ b/Sda1/Etest/rdbms2catalog/src/main/java/de/hdm_stuttgart/mi/sda1/sql2catalog/messages.properties
@@ -0,0 +1,11 @@
+Xml2Rdbms.14='
+Xml2Rdbms.errMsgUnableCloseRdbms=Unable to close RDBMS access
+Xml2Rdbms.errMsgUnableInitDataInsert=Unable to initialize data inserter
+Xml2Rdbms.errMsgUnableRegisterDriverClass=Unable to register driver class '
+Xml2Rdbms.errMsgUnableToConnect=Unable to connect as user '
+Xml2Rdbms.jdbcDriverName=com.mysql.jdbc.Driver
+Xml2Rdbms.jdbcPasswd=XYZ
+Xml2Rdbms.jdbcUrl=jdbc:mysql://localhost:3306/hdm
+Xml2Rdbms.jdbcUser=hdmuser
+Xml2Rdbms.xmlSourceFileName=products.xml
+Xml2Rdbms.errMsgUnableCommitTransaction=Unable to commit transaction
\ No newline at end of file
diff --git a/Sda1/Etest/rdbms2catalog/src/main/resources/log4j2.xml b/Sda1/Etest/rdbms2catalog/src/main/resources/log4j2.xml
new file mode 100644
index 000000000..eda4f3b0d
--- /dev/null
+++ b/Sda1/Etest/rdbms2catalog/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
-- 
GitLab