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