commit 115bd4d29f89b0c5dcf12e8f1d2fa24f8ef9e042 Author: Tilman Walther Date: Fri Feb 10 22:42:30 2012 +0100 inital commit diff --git a/Notes.txt b/Notes.txt new file mode 100755 index 0000000..8d05c8c --- /dev/null +++ b/Notes.txt @@ -0,0 +1,54 @@ +cd /Users/tilman/.m2/repository/hsqldb/hsqldb/1.8.0.10/ +java -cp hsqldb-1.8.0.10.jar org.hsqldb.util.DatabaseManager + jdbc:hsqldb:file:/Volumes/hidrive-mirror/Dokumente/Finanzen/Ausgaben-Datenbank/database/db + sa + +Export nach OOo Calc +SELECT "Datum", "Name", "Betrag", "Beschreibung" FROM "Transaktionen" JOIN "Kategorien" ON "Kategorien"."ID" = "Transaktionen"."Kategorie" ORDER BY "Datum" ASC + + + +Starten: +#!/bin/sh +cd /media/usb/hidrive/Dokumente/Finanzen/Ausgaben-Datenbank/database +screen -S HSQLDB sudo -u nobody java -Duser.timezone=Europe/Berlin -cp hsqldb-1.8.0.10.jar org.hsqldb.Server -database.0 file:db -dbname.0 transaktionen +cd /media/usb/hidrive/Dokumente/Finanzen/Ausgaben-Datenbank +screen -S Transaktionen sudo -u nobody java -Duser.timezone=Europe/Berlin -jar transaktionen.jar + + + + +Transaktion einfügen und ID zurückliefern +INSERT INTO "Transaktionen" ("ID", "Datum", "Kategorie", "Betrag", "Beschreibung") VALUES (null, CURDATE(), 32, 1.99, 'Test'); +CALL IDENTITY(); + +Letzte Transaktion +SELECT * FROM "Transaktionen" WHERE id=(SELECT Max(id) FROM "Transaktionen") + +Export +SELECT "Datum", "Name", "Betrag", "Beschreibung" FROM "Transaktionen" JOIN "Kategorien" ON "Kategorien".ID="Transaktionen"."Kategorie" + +Letzte 10 Transaktionen +SELECT * FROM "Transaktionen" ORDER BY ID desc LIMIT 10 + + +SELECT * FROM "Transaktionen" WHERE "Datum">'2011-01-01' + +SELECT "ID", "Datum", "Kategorie", "Betrag", "Beschreibung" FROM "Transaktionen" ORDER BY "Datum" desc, "ID" desc LIMIT 10 + + + +UPDATE "Transaktionen" SET "Datum"='2011-11-08' WHERE "ID"=930 +UPDATE "Transaktionen" SET "Beschreibung"='Aufladung MyCard' WHERE "ID"=990 +DELETE FROM "Transaktionen" WHERE "ID"=999 +UPDATE "Transaktionen_Tilman" SET "Kategorie"=19 WHERE "ID"=15 + + +screen -S Transaktionen sudo -u nobody java -Duser.timezone=Europe/Berlin -cp hsqldb-1.8.0.10.jar org.hsqldb.Server -database.0 file:db -dbname.0 transaktionen + + +CREATE CACHED TABLE "Kategorien_Tilman"("ID" INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,"Name" VARCHAR(255) NOT NULL); +CREATE CACHED TABLE "Transaktionen_Tilman"("ID" INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,"Datum" DATE NOT NULL,"Kategorie" INTEGER NOT NULL,"Betrag" DECIMAL(50,2) NOT NULL,"Beschreibung" VARCHAR(255)); + +ALTER TABLE "Transaktionen" ADD "Auslage" INTEGER DEFAULT 0 NOT NULL; +INSERT INTO "Kategorien_Tilman" VALUES (null, 'Freizeit - Sport') \ No newline at end of file diff --git a/database/db.backup b/database/db.backup new file mode 100755 index 0000000..f1bec34 Binary files /dev/null and b/database/db.backup differ diff --git a/database/db.data b/database/db.data new file mode 100755 index 0000000..366e14f Binary files /dev/null and b/database/db.data differ diff --git a/database/db.properties b/database/db.properties new file mode 100755 index 0000000..ac1fdf5 --- /dev/null +++ b/database/db.properties @@ -0,0 +1,18 @@ +#HSQL Database Engine 1.8.0.10 +#Thu Dec 22 13:18:48 CET 2011 +hsqldb.script_format=0 +runtime.gc_interval=0 +sql.enforce_strict_size=true +hsqldb.cache_size_scale=8 +readonly=false +hsqldb.nio_data_file=false +hsqldb.cache_scale=13 +version=1.8.0 +hsqldb.default_table_type=cached +hsqldb.cache_file_scale=1 +hsqldb.lock_file=true +hsqldb.log_size=10 +modified=yes +hsqldb.cache_version=1.7.0 +hsqldb.original_version=1.8.0 +hsqldb.compatible_version=1.8.0 diff --git a/database/db.script b/database/db.script new file mode 100755 index 0000000..1d3fef3 --- /dev/null +++ b/database/db.script @@ -0,0 +1,17 @@ +SET DATABASE COLLATION "German" +CREATE SCHEMA PUBLIC AUTHORIZATION DBA +CREATE CACHED TABLE "Kategorien"("ID" INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,"Name" VARCHAR(255) NOT NULL) +CREATE CACHED TABLE "Transaktionen"("ID" INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,"Datum" DATE NOT NULL,"Kategorie" INTEGER NOT NULL,"Betrag" DECIMAL(50,2) NOT NULL,"Beschreibung" VARCHAR(255),"Auslage" INTEGER DEFAULT 0 NOT NULL) +CREATE CACHED TABLE "Kategorien_Tilman"("ID" INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,"Name" VARCHAR(255) NOT NULL) +CREATE CACHED TABLE "Transaktionen_Tilman"("ID" INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL PRIMARY KEY,"Datum" DATE NOT NULL,"Kategorie" INTEGER NOT NULL,"Betrag" DECIMAL(50,2) NOT NULL,"Beschreibung" VARCHAR(255),"Auslage" INTEGER DEFAULT 0 NOT NULL) +SET TABLE "Kategorien" INDEX'108664 37' +SET TABLE "Transaktionen" INDEX'128352 763' +SET TABLE "Kategorien_Tilman" INDEX'163952 2' +SET TABLE "Transaktionen_Tilman" INDEX'164120 3' +ALTER TABLE "Kategorien" ALTER COLUMN "ID" RESTART WITH 37 +ALTER TABLE "Transaktionen" ALTER COLUMN "ID" RESTART WITH 763 +ALTER TABLE "Kategorien_Tilman" ALTER COLUMN "ID" RESTART WITH 2 +ALTER TABLE "Transaktionen_Tilman" ALTER COLUMN "ID" RESTART WITH 3 +CREATE USER SA PASSWORD "" +GRANT DBA TO SA +SET WRITE_DELAY 60 diff --git a/pom.xml b/pom.xml new file mode 100755 index 0000000..5a3ee53 --- /dev/null +++ b/pom.xml @@ -0,0 +1,56 @@ + + 4.0.0 + Transaktionen + Transaktionen + 0.0.1-SNAPSHOT + + + + org.mortbay.jetty + jetty-maven-plugin + 8.0.1.v20110908 + + + org.codehaus.mojo + exec-maven-plugin + 1.2 + + java + + + org.example.HelloWorld + + + + + + + log4j + log4j + 1.2.14 + jar + compile + + + org.mortbay.jetty + jetty-embedded + 6.1.26 + jar + compile + + + hsqldb + hsqldb + 1.8.0.10 + jar + compile + + + org.apache.commons + commons-lang3 + 3.0.1 + jar + compile + + + \ No newline at end of file diff --git a/resources/icon.png b/resources/icon.png new file mode 100755 index 0000000..ec7dfa1 Binary files /dev/null and b/resources/icon.png differ diff --git a/resources/icon.svg b/resources/icon.svg new file mode 100755 index 0000000..a4cb107 --- /dev/null +++ b/resources/icon.svg @@ -0,0 +1,2560 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + 10 + 10 + + 10 + + + + + + + 10 + 10 + + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + 10 + + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 10 + 10 + + 10 + + + + + + + 10 + 10 + + 10 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/resources/icon1.png b/resources/icon1.png new file mode 100755 index 0000000..3c46b48 Binary files /dev/null and b/resources/icon1.png differ diff --git a/resources/icon2.png b/resources/icon2.png new file mode 100755 index 0000000..8325ded Binary files /dev/null and b/resources/icon2.png differ diff --git a/resources/icon3.png b/resources/icon3.png new file mode 100755 index 0000000..c8d170a Binary files /dev/null and b/resources/icon3.png differ diff --git a/src/main/java/de/tilman/transactions/DatabaseController.java b/src/main/java/de/tilman/transactions/DatabaseController.java new file mode 100755 index 0000000..50837c4 --- /dev/null +++ b/src/main/java/de/tilman/transactions/DatabaseController.java @@ -0,0 +1,129 @@ +package de.tilman.transactions; + +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.LinkedList; +import java.util.Map; +import java.util.SortedMap; +import java.util.TreeMap; + +import org.apache.log4j.Logger; + +public class DatabaseController { + + private final static Logger log = Logger.getLogger(DatabaseController.class); + + final String DB_TREIBER = "org.hsqldb.jdbcDriver"; +// final String DB_URL = "jdbc:hsqldb:file:database/db;ifexists=true;shutdown=true"; // embedded mode, für Testzwecke + final String DB_URL = "jdbc:hsqldb:hsql://localhost/transaktionen"; // Datenbank läuft separat im server mode + final String DB_LOGIN = "sa"; + final String DB_PASSWORT = ""; + + String tblTransactions = "Transaktionen"; + String tblCategories = "Kategorien"; + + Connection connection; + Statement statement; + PreparedStatement selectCategoriesSql; + PreparedStatement insertTransactionSql; + PreparedStatement getLastIdSql; + ResultSet resultSet; + + String path; + boolean hasAuslagen; + + public DatabaseController(String tblTransactions, String tblCategories, String path, boolean hasAuslagen) throws Exception { + + this.tblTransactions = tblTransactions; + this.tblCategories = tblCategories; + this.path = path; + this.hasAuslagen = hasAuslagen; + + Class.forName("org.hsqldb.jdbcDriver"); + + connection = DriverManager.getConnection(DB_URL, DB_LOGIN, DB_PASSWORT); + statement = connection.createStatement(); + + // prepare SQL statements + selectCategoriesSql = connection.prepareCall("SELECT * FROM \""+tblCategories+"\" ORDER BY \"ID\" asc"); + insertTransactionSql = connection.prepareCall("INSERT INTO \""+tblTransactions+"\" (\"ID\", \"Datum\", \"Kategorie\", \"Betrag\", \"Beschreibung\", \"Auslage\") VALUES (null,?,?,?,?,?)"); + } + + public SortedMap getCategories() throws SQLException { + resultSet = selectCategoriesSql.executeQuery(); + TreeMap categoryMap = new TreeMap(); + while (resultSet.next()) { + categoryMap.put(resultSet.getInt(1), resultSet.getString(2)); + } + return categoryMap; + } + + public int writeTransaction(Transaktion transaction) throws SQLException { + insertTransactionSql.setBigDecimal(3, transaction.betrag); + insertTransactionSql.setInt(2, transaction.kategorie); + insertTransactionSql.setDate(1, new java.sql.Date(transaction.datum.getTime())); + insertTransactionSql.setString(4, transaction.beschreibung); + insertTransactionSql.setInt(5, transaction.auslage); + insertTransactionSql.execute(); + + // return the ID of the new row + resultSet = statement.executeQuery("CALL IDENTITY();"); + resultSet.next(); + int lastId = resultSet.getInt(1); + log.info("written transaction with ID " + lastId); + return lastId; + } + + public void deleteTransaction(int id) throws SQLException { + log.info("delete transaction #" + id); + statement.execute("DELETE FROM \""+tblTransactions+"\" WHERE id=" + id); + } + + public Transaktion getLastTransaction() throws SQLException { + resultSet = statement.executeQuery("SELECT \"ID\", \"Datum\", \"Kategorie\", \"Betrag\", \"Beschreibung\", \"Auslage\" FROM \""+tblTransactions+"\" WHERE id = (SELECT Max(id) FROM \""+tblTransactions+"\");"); + resultSet.next(); + return new Transaktion(resultSet.getInt(1), resultSet.getBigDecimal(4), resultSet.getInt(3), resultSet.getDate(2), resultSet.getString(5), resultSet.getInt(6)); + } + + public LinkedList getLastTransactions(int num) throws SQLException { + LinkedList list = new LinkedList(); + Map categories = getCategories(); + resultSet = statement.executeQuery("SELECT \"ID\", \"Datum\", \"Kategorie\", \"Betrag\", \"Beschreibung\", \"Auslage\" FROM \""+tblTransactions+"\" ORDER BY \"Datum\" desc, \"ID\" desc LIMIT " + num); + while (resultSet.next()) { + Transaktion trns = new Transaktion(resultSet.getInt(1), resultSet.getBigDecimal(4), resultSet.getInt(3), categories.get(resultSet.getInt(3)), resultSet.getDate(2), resultSet.getString(5), resultSet.getInt(6)); + list.push(trns); + } + return list; + } + + public BigDecimal getSumExpenses(int id) throws SQLException { + resultSet = statement.executeQuery("SELECT SUM(\"Betrag\") FROM \"" + tblTransactions + "\" WHERE \"Auslage\"=" + id); + resultSet.next(); + BigDecimal result = resultSet.getBigDecimal(1); + if (result == null) + return new BigDecimal(0); + return result; + } + + public void resetExpenses(int id) throws SQLException { + log.info("resetting expenses for ID " + id); + statement.execute("UPDATE \"Transaktionen\" SET \"Auslage\"=0 WHERE \"Auslage\"=" + id); + } + + public void close() throws SQLException { + selectCategoriesSql.close(); + insertTransactionSql.close(); + + log.info("shutting down database"); + statement.execute("SHUTDOWN COMPACT"); + statement.close(); + + connection.close(); + log.info("database closed"); + } +} diff --git a/src/main/java/de/tilman/transactions/Service.java b/src/main/java/de/tilman/transactions/Service.java new file mode 100755 index 0000000..3ff869c --- /dev/null +++ b/src/main/java/de/tilman/transactions/Service.java @@ -0,0 +1,398 @@ +package de.tilman.transactions; + +import java.io.IOException; +import java.io.PrintWriter; +import java.math.BigDecimal; +import java.sql.SQLException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.SortedMap; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.lang3.StringEscapeUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.BasicConfigurator; +import org.apache.log4j.ConsoleAppender; +import org.apache.log4j.Logger; +import org.apache.log4j.PatternLayout; +import org.mortbay.jetty.Handler; +import org.mortbay.jetty.Server; +import org.mortbay.jetty.handler.DefaultHandler; +import org.mortbay.jetty.handler.HandlerList; +import org.mortbay.jetty.handler.ResourceHandler; +import org.mortbay.jetty.servlet.Context; +import org.mortbay.jetty.servlet.ServletHolder; +import org.mortbay.thread.QueuedThreadPool; + +public class Service { + + private final static Logger log = Logger.getLogger(Service.class); + private static int hostPort = 8080; + + protected Server jetty; + + private static SimpleDateFormat formatter = new SimpleDateFormat("dd.MM.yyyy"); + + private Random rnd = new Random(); + + public void start() { + BasicConfigurator.configure(new ConsoleAppender(new PatternLayout("%d{ISO8601} - %m%n"))); + + try { + log.info("open database"); + DatabaseController database = new DatabaseController("Transaktionen", "Kategorien", "/input", true); + log.info("add shutdown hook for database"); + Runtime.getRuntime().addShutdownHook(new ShutdownThread(database)); + + DatabaseController databaseTilman = new DatabaseController("Transaktionen_Tilman", "Kategorien_Tilman", "/tilman", false); + + jetty = new Server(hostPort); + jetty.setThreadPool(new QueuedThreadPool(10)); + + Context inputContext = new Context(jetty, "/", Context.SESSIONS); + inputContext.addServlet(new ServletHolder(new ReadServlet(database)), "/input"); + inputContext.addServlet(new ServletHolder(new StatsServlet(database)), "/input/last"); + inputContext.addServlet(new ServletHolder(new CsvServlet(database)), "/input/csv"); + + inputContext.addServlet(new ServletHolder(new ReadServlet(databaseTilman)), "/tilman"); + inputContext.addServlet(new ServletHolder(new StatsServlet(databaseTilman)), "/tilman/last"); + inputContext.addServlet(new ServletHolder(new CsvServlet(databaseTilman)), "/tilman/csv"); + + + ResourceHandler resourceHandler = new ResourceHandler(); + resourceHandler.setResourceBase("resources"); + + log.info("serving " + resourceHandler.getBaseResource()); + HandlerList handlers = new HandlerList(); + handlers.setHandlers(new Handler[] { resourceHandler, inputContext, new DefaultHandler() }); + jetty.setHandler(handlers); + + jetty.start(); + jetty.join(); + log.info("Listening at " + hostPort); + } catch (Exception e) { + e.printStackTrace(); + log.fatal("Failed to start on port " + hostPort + ", reason: " + e.getMessage()); + } + } + + protected static void writeHeader(PrintWriter out) { + out.println("\n" + + "" + + "Ausgaben" + + ""); + out.println(""); + out.println(""); + out.println(""); + out.println(""); + out.println(""); // onload='document.forms[0].betrag.focus()' + } + + protected static void writeFooter(PrintWriter out) { + out.println(""); + out.close(); + } + + protected static void showTable(DatabaseController database, int num, PrintWriter out) throws ServletException { + out.println(""); + out.println(""); + + + LinkedList transactions = null; + try { + transactions = database.getLastTransactions(num); + } catch (SQLException se) { + throw new ServletException(se); + } + + while (!transactions.isEmpty()) { + Transaktion t = transactions.removeLast(); + out.println(""); + } + + out.println("
DatumKategorieBetragBeschreibung
" + formatter.format(t.datum) + "" + StringEscapeUtils.escapeHtml4(t.kategorieName) + " 0) ? "style=\"background-color: #ccddff;\">" : ">") + t.betrag.toPlainString() + " €" + ((t.beschreibung == null) ? "" : StringEscapeUtils.escapeHtml4(t.beschreibung)) + "
"); + + } + + + public class ReadServlet extends HttpServlet { + private static final long serialVersionUID = 1572581546682459768L; + + private int undoChallenge = -1; + private int auslagenChallenge = -1; + private int lastId = -1; + private DatabaseController database; + + public ReadServlet(DatabaseController database) { + super(); + this.database = database; + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.setContentType("text/html;charset=utf-8"); + response.setStatus(HttpServletResponse.SC_OK); + PrintWriter out = response.getWriter(); + + writeHeader(out); + + if (request.getParameter("chl") != null) { + if ((undoChallenge == Integer.parseInt(request.getParameter("chl"))) && (lastId == Integer.parseInt(request.getParameter("del")))) { + try { + database.deleteTransaction(lastId); + } catch (SQLException se) { + throw new ServletException(se); + } + showMessage(out, "Transaktion gelöscht."); + } + else if (auslagenChallenge == Integer.parseInt(request.getParameter("chl"))) { + try { + database.resetExpenses(Integer.parseInt(request.getParameter("id"))); + } catch (SQLException se) { + throw new ServletException(se); + } + showMessage(out, "Auslagen zurückgesetzt."); + } + undoChallenge = -1; + auslagenChallenge = -1; + } + + showInputForm(out); + showTable(database, 10, out); + showAuslagen(out); + writeFooter(out); + } + + protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.setContentType("text/html;charset=utf-8"); + + boolean error = false; + String errorMessage = null; + + // der Betrag kann mit Punkt oder Komma als Dezimalzeichen eingegeben werden + String betragStr = StringUtils.replaceChars(request.getParameter("betrag"), ',', '.'); + + // wenn kein Vorzeichen angegeben wurde, nehmen wir eine Ausgabe an + // und setzen den Betrag negativ + if (!(betragStr.startsWith("-") || betragStr.startsWith("+"))) { + betragStr = "-" + betragStr; + } + + BigDecimal betrag = null; + try { + betrag = new BigDecimal(betragStr); + if (betrag.compareTo(BigDecimal.valueOf(0)) == 0) + error = true; + } + catch (NumberFormatException nfe) { + error = true; + } + + if (error) + errorMessage = "Fehler: "" + request.getParameter("betrag") + "" ist kein zulässiger Betrag."; + + Date datum = null; + try { + datum = formatter.parse(request.getParameter("datum")); + } catch (ParseException pe) { + error = true; + errorMessage = "Fehler: "" + request.getParameter("datum") + "" ist kein zulässiges Datum."; + } + + if (!error) { + Transaktion transaction = new Transaktion(betrag, Integer.parseInt(request.getParameter("kategorie")), datum, request.getParameter("beschreibung"), (database.hasAuslagen ? Integer.parseInt(request.getParameter("auslage")) : 0)); + try { + lastId = database.writeTransaction(transaction); + } catch (SQLException se) { + throw new ServletException(se); + } + } + + response.setStatus(HttpServletResponse.SC_OK); + PrintWriter out = response.getWriter(); + + writeHeader(out); + if (!error) + showLastTransaction(out); + else + showMessage(out, errorMessage); + showInputForm(out); + showTable(database, 10, out); + showAuslagen(out); + writeFooter(out); + } + + private void showInputForm(PrintWriter out) throws ServletException { + + SortedMap categories; + try { + categories = database.getCategories(); + } catch (SQLException e) { + throw new ServletException(e); + } + + out.println("
"); + + out.println(""); + out.println(""); + out.println(""); + out.println(""); + + if (database.hasAuslagen) + out.println(""); + + out.println("
Betrag:
Kategorie:
Datum:
Notiz:
Auslage: Keine    Tilman    Anica
"); + + out.println("
"); + } + + private void showAuslagen(PrintWriter out) throws ServletException { + if (database.hasAuslagen) { + auslagenChallenge = rnd.nextInt(Integer.MAX_VALUE); + + out.println(""); + try { + out.println(""); + out.println(""); + } catch (SQLException se) { + throw new ServletException(se); + } + out.println("
Auslagen Anica " + database.getSumExpenses(2) + " €überwiesen
Auslagen Tilman " + database.getSumExpenses(1) + " €überwiesen
"); + } + } + + private void showLastTransaction(PrintWriter out) throws ServletException { + Transaktion trns = null; + try { + trns = database.getLastTransaction(); + } catch (SQLException e) { + throw new ServletException(e); + } + out.println("
"); + out.println("gespeichert: "); + out.print(trns.datum + " "); + if (trns.betrag.compareTo(BigDecimal.valueOf(0)) < 0) { + out.print(""); + } + else { + out.print(""); + } + out.println(trns.betrag.toPlainString() + " €"); + + undoChallenge = rnd.nextInt(Integer.MAX_VALUE); + + out.println("   löschen"); + out.println("
"); + } + + private void showMessage(PrintWriter out, String message) { + out.println("
"); + out.println(message); + out.println("
"); + } + } + + public class StatsServlet extends HttpServlet { + private static final long serialVersionUID = 4104919572342151480L; + private DatabaseController database; + + public StatsServlet(DatabaseController database) { + super(); + this.database = database; + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + response.setContentType("text/html;charset=utf-8"); + response.setStatus(HttpServletResponse.SC_OK); + PrintWriter out = response.getWriter(); + + writeHeader(out); + showTable(database, ((request.getParameter("n") != null) ? Integer.parseInt(request.getParameter("n")) : 20), out); + writeFooter(out); + } + } + + public class CsvServlet extends HttpServlet { + private static final long serialVersionUID = 4104919572342151480L; + private DatabaseController database; + + public CsvServlet(DatabaseController database) { + super(); + this.database = database; + } + + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { + + char separator = ';'; + + if (request.getParameter("separator") != null) { + separator = request.getParameter("separator").charAt(0); + } + + response.setContentType("text/html;charset=utf-8"); + response.setStatus(HttpServletResponse.SC_OK); + PrintWriter out = response.getWriter(); + + writeHeader(out); + + out.println("
");
+			out.println("ID" + separator + "Datum" + separator + "Kategorie" + separator + "Betrag" + separator + "Beschreibung");	        
+	        
+	        List transactions = null;
+	        try {
+				transactions = database.getLastTransactions(((request.getParameter("n") != null) ? Integer.parseInt(request.getParameter("n")) : 50));
+			} catch (SQLException se) {
+				throw new ServletException(se);
+			}
+	        
+			for (Transaktion t : transactions) {
+				String s = "" + t.id + separator + formatter.format(t.datum) + separator + StringEscapeUtils.escapeHtml4(t.kategorieName) + separator + t.betrag.toPlainString() + separator + ((t.beschreibung == null) ? "" : StringEscapeUtils.escapeHtml4(t.beschreibung));
+				System.out.println(s);
+				out.println(s);
+			}
+	        
+			out.println("
"); + + writeFooter(out); + } + } + + class ShutdownThread extends Thread { + DatabaseController database; + + public ShutdownThread(DatabaseController database) { + this.database = database; + } + + public void run() { + try { + database.close(); + } catch (SQLException se) { + log.error(se); + } + } + } + + public static void main(String[] args) { + Service service = new Service(); + service.start(); + } +} diff --git a/src/main/java/de/tilman/transactions/Transaktion.java b/src/main/java/de/tilman/transactions/Transaktion.java new file mode 100755 index 0000000..b862f30 --- /dev/null +++ b/src/main/java/de/tilman/transactions/Transaktion.java @@ -0,0 +1,32 @@ +package de.tilman.transactions; + +import java.math.BigDecimal; +import java.util.Date; + +public class Transaktion { + public int id; + public BigDecimal betrag; + public int kategorie; + public String kategorieName; + public Date datum; + public String beschreibung; + public int auslage; + + public Transaktion(int id, BigDecimal betrag, int kategorie, Date datum, String beschreibung, int auslage) { + this.id = id; + this.betrag = betrag; + this.kategorie = kategorie; + this.datum = datum; + this.beschreibung = beschreibung; + this.auslage = auslage; + } + + public Transaktion(int id, BigDecimal betrag, int kategorie, String kategorieName, Date datum, String beschreibung, int auslage) { + this(id, betrag, kategorie, datum, beschreibung, auslage); + this.kategorieName = kategorieName; + } + + public Transaktion(BigDecimal betrag, int kategorie, Date datum, String beschreibung, int auslage) { + this(-1, betrag, kategorie, datum, beschreibung, auslage); + } +} diff --git a/src/main/java/org/example/HelloServlet.java b/src/main/java/org/example/HelloServlet.java new file mode 100755 index 0000000..cbec2a2 --- /dev/null +++ b/src/main/java/org/example/HelloServlet.java @@ -0,0 +1,18 @@ +package org.example; + +import java.io.IOException; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServlet; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +public class HelloServlet extends HttpServlet +{ + protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException + { + response.setContentType("text/html"); + response.setStatus(HttpServletResponse.SC_OK); + response.getWriter().println("

Hello Servlet

"); + response.getWriter().println("session=" + request.getSession(true).getId()); + } +} \ No newline at end of file diff --git a/src/main/java/org/example/HelloWorld.java b/src/main/java/org/example/HelloWorld.java new file mode 100755 index 0000000..4cea52b --- /dev/null +++ b/src/main/java/org/example/HelloWorld.java @@ -0,0 +1,32 @@ +package org.example; + +import java.io.IOException; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.mortbay.jetty.HttpConnection; +import org.mortbay.jetty.Request; +import org.mortbay.jetty.Server; +import org.mortbay.jetty.handler.AbstractHandler; + +public class HelloWorld extends AbstractHandler { + + public void handle(String target, HttpServletRequest request, HttpServletResponse response, int dispatch) throws IOException, + ServletException { + response.setContentType("text/html;charset=utf-8"); + response.setStatus(HttpServletResponse.SC_OK); + response.getWriter().println("
Aloha,\nfunky time
"); + Request base_request = (request instanceof Request) ? (Request)request:HttpConnection.getCurrentConnection().getRequest(); + base_request.setHandled(true); + } + + public static void main(String[] args) throws Exception { + Server server = new Server(8080); + server.setHandler(new HelloWorld()); + + server.start(); + server.join(); + } +} \ No newline at end of file diff --git a/src/webapp/WEB-INF/index.html b/src/webapp/WEB-INF/index.html new file mode 100755 index 0000000..426b5a5 --- /dev/null +++ b/src/webapp/WEB-INF/index.html @@ -0,0 +1,2 @@ +

Hello World Webapp

+Hello Servlet \ No newline at end of file diff --git a/src/webapp/WEB-INF/web.xml b/src/webapp/WEB-INF/web.xml new file mode 100755 index 0000000..a8b529f --- /dev/null +++ b/src/webapp/WEB-INF/web.xml @@ -0,0 +1,15 @@ + + + + Hello + org.example.HelloServlet + + + Hello + /hello/* + + \ No newline at end of file diff --git a/target/classes/de/tilman/transactions/DatabaseController.class b/target/classes/de/tilman/transactions/DatabaseController.class new file mode 100755 index 0000000..f384660 Binary files /dev/null and b/target/classes/de/tilman/transactions/DatabaseController.class differ diff --git a/target/classes/de/tilman/transactions/Service$CsvServlet.class b/target/classes/de/tilman/transactions/Service$CsvServlet.class new file mode 100755 index 0000000..f67b59d Binary files /dev/null and b/target/classes/de/tilman/transactions/Service$CsvServlet.class differ diff --git a/target/classes/de/tilman/transactions/Service$ReadServlet.class b/target/classes/de/tilman/transactions/Service$ReadServlet.class new file mode 100755 index 0000000..454f7a3 Binary files /dev/null and b/target/classes/de/tilman/transactions/Service$ReadServlet.class differ diff --git a/target/classes/de/tilman/transactions/Service$ShutdownThread.class b/target/classes/de/tilman/transactions/Service$ShutdownThread.class new file mode 100755 index 0000000..1470aec Binary files /dev/null and b/target/classes/de/tilman/transactions/Service$ShutdownThread.class differ diff --git a/target/classes/de/tilman/transactions/Service$StatsServlet.class b/target/classes/de/tilman/transactions/Service$StatsServlet.class new file mode 100755 index 0000000..9dd6a8a Binary files /dev/null and b/target/classes/de/tilman/transactions/Service$StatsServlet.class differ diff --git a/target/classes/de/tilman/transactions/Service.class b/target/classes/de/tilman/transactions/Service.class new file mode 100755 index 0000000..a0884f8 Binary files /dev/null and b/target/classes/de/tilman/transactions/Service.class differ diff --git a/target/classes/de/tilman/transactions/Transaktion.class b/target/classes/de/tilman/transactions/Transaktion.class new file mode 100755 index 0000000..42502a0 Binary files /dev/null and b/target/classes/de/tilman/transactions/Transaktion.class differ diff --git a/target/classes/org/example/HelloServlet.class b/target/classes/org/example/HelloServlet.class new file mode 100755 index 0000000..8180b85 Binary files /dev/null and b/target/classes/org/example/HelloServlet.class differ diff --git a/target/classes/org/example/HelloWorld.class b/target/classes/org/example/HelloWorld.class new file mode 100755 index 0000000..3e8743d Binary files /dev/null and b/target/classes/org/example/HelloWorld.class differ