From 47aa5a1437d4580979867ae27d8937c5687d69ee Mon Sep 17 00:00:00 2001
From: Martin Goik <goik@hdm-stuttgart.de>
Date: Thu, 30 Oct 2014 19:49:10 +0100
Subject: [PATCH] Reading account sums

---
 .../mi/sda2/account/BrowserDriver.java        | 77 +++++++++++++++++++
 .../mi/sda2/account/gui/ExceptionDialog.java  | 43 ++++++-----
 .../mi/sda2/account/sql/DbHandler.java        | 27 ++++++-
 .../hdm_stuttgart/mi/sda2/account/DbTest.java |  4 +-
 4 files changed, 129 insertions(+), 22 deletions(-)
 create mode 100644 Sda2/P/account/src/main/java/de/hdm_stuttgart/mi/sda2/account/BrowserDriver.java

diff --git a/Sda2/P/account/src/main/java/de/hdm_stuttgart/mi/sda2/account/BrowserDriver.java b/Sda2/P/account/src/main/java/de/hdm_stuttgart/mi/sda2/account/BrowserDriver.java
new file mode 100644
index 000000000..d07080794
--- /dev/null
+++ b/Sda2/P/account/src/main/java/de/hdm_stuttgart/mi/sda2/account/BrowserDriver.java
@@ -0,0 +1,77 @@
+package de.hdm_stuttgart.mi.sda2.account;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import javafx.application.Application;
+import javafx.geometry.Insets;
+import javafx.geometry.Pos;
+import javafx.scene.Scene;
+import javafx.scene.control.Button;
+import javafx.scene.control.Label;
+import javafx.scene.control.TextField;
+import javafx.scene.layout.GridPane;
+import javafx.scene.text.Font;
+import javafx.scene.text.FontWeight;
+import javafx.scene.text.Text;
+import javafx.stage.Stage;
+import de.hdm_stuttgart.mi.sda2.account.sql.DbHandler;
+
+public class BrowserDriver extends Application {
+
+	final DbHandler dbh = new DbHandler();
+	
+    final TextField accountSum = new TextField();
+    
+    final Button
+		refreshBtn = new Button("Refresh");
+    
+    public static void main( String[] args ) {
+    	launch(args);
+    }
+    public BrowserDriver() throws SQLException {
+    	dbh.connect(Connection.TRANSACTION_READ_UNCOMMITTED, true);
+    	refreshBtn.setOnAction(event-> {
+    		accountSum.setText("" + dbh.getAccountSum());
+    		});
+    	
+    	accountSum.setEditable(false);
+    	accountSum.setText("" + dbh.getAccountSum());
+    }
+    
+    @Override
+    public void start(final Stage primaryStage) throws SQLException {
+    	
+
+        primaryStage.setTitle("Browsing accounts");
+        
+        final GridPane grid = new GridPane();
+        grid.setAlignment(Pos.CENTER);
+        grid.setHgap(10);
+        grid.setVgap(10);
+        grid.setPadding(new Insets(25, 25, 25, 25));
+        
+        int currentRowIndex = 0;
+        final Text scenetitle = new Text("Sum of balances");
+        scenetitle.setFont(Font.font("Tahoma", FontWeight.NORMAL, 20));
+        grid.add(scenetitle, 0, currentRowIndex, 2, 1);
+        
+        currentRowIndex++;
+        grid.add(new Label("Balances sum:"), 0, currentRowIndex);
+        grid.add(accountSum, 1, currentRowIndex);
+
+        currentRowIndex++;
+        grid.add(refreshBtn, 1, currentRowIndex);
+        
+        Scene scene = new Scene(grid, 300, 250);
+        primaryStage.setScene(scene);
+        primaryStage.show();
+        
+    }
+    
+    @Override
+	public void stop() throws Exception {
+		super.stop();
+        dbh.close();
+	}
+}
diff --git a/Sda2/P/account/src/main/java/de/hdm_stuttgart/mi/sda2/account/gui/ExceptionDialog.java b/Sda2/P/account/src/main/java/de/hdm_stuttgart/mi/sda2/account/gui/ExceptionDialog.java
index f211f40da..50af5d123 100644
--- a/Sda2/P/account/src/main/java/de/hdm_stuttgart/mi/sda2/account/gui/ExceptionDialog.java
+++ b/Sda2/P/account/src/main/java/de/hdm_stuttgart/mi/sda2/account/gui/ExceptionDialog.java
@@ -16,7 +16,7 @@ import javafx.scene.layout.Priority;
  *
  */
 public class ExceptionDialog {
-	
+
 	/**
 	 * Showing an error box and terminating without any further error processing
 	 * 
@@ -26,7 +26,7 @@ public class ExceptionDialog {
 	 * 
 	 */
 	public static void showExceptionAndExit(final String msg, final Exception ex, int exitCode) {
-		
+
 		Alert alert = new Alert(AlertType.ERROR);
 		alert.setTitle("Unrecoverable error");
 		alert.setHeaderText("Application will be terminated!");
@@ -34,29 +34,32 @@ public class ExceptionDialog {
 
 
 		// Create expandable Exception.
-		StringWriter sw = new StringWriter();
-		PrintWriter pw = new PrintWriter(sw);
-		ex.printStackTrace(pw);
-		String exceptionText = sw.toString();
 
-		Label label = new Label("You may copy and forward this exception stacktrace to an expert:");
+		if (null != ex) {
+			StringWriter sw = new StringWriter();
+			PrintWriter pw = new PrintWriter(sw);
+			ex.printStackTrace(pw);
+			String exceptionText = sw.toString();
+
+			Label label = new Label("You may copy and forward this exception stacktrace to an expert:");
 
-		TextArea textArea = new TextArea(exceptionText);
-		textArea.setEditable(false);
-		textArea.setWrapText(true);
+			TextArea textArea = new TextArea(exceptionText);
+			textArea.setEditable(false);
+			textArea.setWrapText(true);
 
-		textArea.setMaxWidth(Double.MAX_VALUE);
-		textArea.setMaxHeight(Double.MAX_VALUE);
-		GridPane.setVgrow(textArea, Priority.ALWAYS);
-		GridPane.setHgrow(textArea, Priority.ALWAYS);
+			textArea.setMaxWidth(Double.MAX_VALUE);
+			textArea.setMaxHeight(Double.MAX_VALUE);
+			GridPane.setVgrow(textArea, Priority.ALWAYS);
+			GridPane.setHgrow(textArea, Priority.ALWAYS);
 
-		GridPane expContent = new GridPane();
-		expContent.setMaxWidth(Double.MAX_VALUE);
-		expContent.add(label, 0, 0);
-		expContent.add(textArea, 0, 1);
+			GridPane expContent = new GridPane();
+			expContent.setMaxWidth(Double.MAX_VALUE);
+			expContent.add(label, 0, 0);
+			expContent.add(textArea, 0, 1);
 
-		// Set expandable Exception into the dialog pane.
-		alert.getDialogPane().setExpandableContent(expContent);
+			// Set expandable Exception into the dialog pane.
+			alert.getDialogPane().setExpandableContent(expContent);
+		}
 
 		alert.showAndWait();
 		System.exit(exitCode);
diff --git a/Sda2/P/account/src/main/java/de/hdm_stuttgart/mi/sda2/account/sql/DbHandler.java b/Sda2/P/account/src/main/java/de/hdm_stuttgart/mi/sda2/account/sql/DbHandler.java
index 5111f6c76..d6e3adbe3 100644
--- a/Sda2/P/account/src/main/java/de/hdm_stuttgart/mi/sda2/account/sql/DbHandler.java
+++ b/Sda2/P/account/src/main/java/de/hdm_stuttgart/mi/sda2/account/sql/DbHandler.java
@@ -3,6 +3,7 @@ package de.hdm_stuttgart.mi.sda2.account.sql;
 import java.sql.Connection;
 import java.sql.DriverManager;
 import java.sql.PreparedStatement;
+import java.sql.ResultSet;
 import java.sql.SQLException;
 
 import org.apache.log4j.Logger;
@@ -16,8 +17,13 @@ public class DbHandler {
 	
 	Connection conn = null;
 	boolean autoCommit;
+	
+	final static String updateAccountSql = "UPDATE Account SET balance = balance + ? WHERE number = ?";
 	PreparedStatement updateAccount; 
 
+	final static String accountSumSql = "SELECT SUM(balance) FROM Account";
+	PreparedStatement accountSum; 
+
 	private String getConnectionName() {
 		return Conf.get("DbHandler.user") + '@' + Conf.get("DbHandler.jdbcUrl");
 	}
@@ -31,7 +37,10 @@ public class DbHandler {
 					Conf.get("DbHandler.password"));
 			conn.setAutoCommit(autoCommit);
 			conn.setTransactionIsolation(isolationLevel);
-			updateAccount = conn.prepareStatement("UPDATE Account SET balance = balance + ? WHERE number = ?");
+			
+			updateAccount = conn.prepareStatement(updateAccountSql);
+			accountSum = conn.prepareStatement(accountSumSql);
+			
 			log.info("Connection '" + getConnectionName() + "' established" ); 
 			return true;
 		} catch (SQLException e) {
@@ -69,6 +78,22 @@ public class DbHandler {
 		}
 	}
 	
+	public int getAccountSum() {
+		try {
+			final ResultSet rs = accountSum.executeQuery();
+			if (rs.next()) {
+				final int ret = rs.getInt(1);
+				rs.close();
+				return  ret;
+			} else {
+				ExceptionDialog.showExceptionAndExit("Weird problem summing up balances problem: ", null, 1);
+			}
+		} catch (SQLException e) {
+			ExceptionDialog.showExceptionAndExit("Committing transaction failed: ", e, 1);
+		}
+		return 0;
+	}
+	
 	public void changeBy(int accountNo, int amount) {
 		try {
 			updateAccount.setInt(1, amount);
diff --git a/Sda2/P/account/src/test/java/de/hdm_stuttgart/mi/sda2/account/DbTest.java b/Sda2/P/account/src/test/java/de/hdm_stuttgart/mi/sda2/account/DbTest.java
index 1fff21a76..133371bf7 100644
--- a/Sda2/P/account/src/test/java/de/hdm_stuttgart/mi/sda2/account/DbTest.java
+++ b/Sda2/P/account/src/test/java/de/hdm_stuttgart/mi/sda2/account/DbTest.java
@@ -1,5 +1,7 @@
 package de.hdm_stuttgart.mi.sda2.account;
 
+import java.sql.Connection;
+
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -13,7 +15,7 @@ public class DbTest {
     public void testApp() {
         DbHandler dbh = new DbHandler();
         
-        dbh.connect();
+        dbh.connect(Connection.TRANSACTION_SERIALIZABLE, false);
         
         dbh.changeBy(1, 20);
         dbh.changeBy(2, -20);
-- 
GitLab