package de.tud.kom.socom.web.server.database.reporting; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; import de.tud.kom.socom.web.client.sharedmodels.Report; import de.tud.kom.socom.web.client.util.exceptions.IllegalTypeException; import de.tud.kom.socom.web.server.database.HSQLAccess; public class HSQLReportDatabaseAccess implements ReportDatabaseAccess { private static ReportDatabaseAccess instance = new HSQLReportDatabaseAccess(); private static HSQLAccess db; private HSQLReportDatabaseAccess() { db = HSQLAccess.getInstance(); } public static ReportDatabaseAccess getInstance() { return instance; } @Override public boolean createReport(long uid, long reference, String reference2, String reportTypeIdentifier, String report) throws SQLException, IllegalTypeException { PreparedStatement typeStatement = db.getPreparedStatement("SELECT id FROM reporttypes WHERE type = ?"); typeStatement.setString(1, reportTypeIdentifier); ResultSet rs = typeStatement.executeQuery(); if(!rs.next()) throw new IllegalTypeException(reportTypeIdentifier + " does not exist"); long typeid = rs.getLong(1); PreparedStatement statement = db.getPreparedStatement("INSERT INTO reports " + "(informant, type, reference, reference2, report) VALUES (" + "?,?,?,?,?);"); statement.setLong(1, uid); statement.setLong(2, typeid); statement.setLong(3, reference); statement.setString(4, reference2); statement.setString(5, report); return statement.executeUpdate() == 1; } @Override public List<Report> fetchReports(String[] types, boolean alreadyReviewed, String fromInformant, int limit, int offset, int sortPolicy, boolean ascending) throws SQLException { //fromInformant: if null ignore //sortPolicy coding: 0=date, 1=type, 2=informant String selectQ = "SELECT * FROM reports " + "LEFT JOIN reporttypes ON reports.type = reporttypes.id " + "LEFT JOIN users ON users.uid = reports.informant "; String whereQ = "WHERE true " + (alreadyReviewed ? "" : "AND reviewed = false ") + (fromInformant == null ? "" : "AND users.name = ? "); whereQ += "AND ("; for(int i = 0; i < types.length; i++) whereQ += " reporttypes.type = ? " + (i == types.length-1 ? "" : "OR "); whereQ += ") "; String orderQ = "ORDER BY " + (sortPolicy == 0 ? "reports.date " : (sortPolicy == 1 ? "reports.type " : (sortPolicy == 2 ? "UPPER(users.name) " : "reports.id "))); orderQ += ascending ? "ASC " : "DESC "; String limitQ = "LIMIT ? OFFSET ?;"; String query = selectQ + whereQ + orderQ + limitQ; PreparedStatement statement = db.getPreparedStatement(query); int c = 1; if(fromInformant != null) statement.setString(c++, fromInformant); for(String type : types) statement.setString(c++, type); statement.setInt(c++, limit); statement.setInt(c, offset); ResultSet rs = statement.executeQuery(); List<Report> result = new ArrayList<Report>(); while(rs.next()) { long id = rs.getLong("reports.id"); long type = rs.getLong("reports.type"); long reference = rs.getLong("reports.reference"); long date = rs.getTimestamp("reports.date").getTime(); long informant = rs.getLong("reports.informant"); long reviewedby = rs.getLong("reviewedby"); Timestamp reviewtime = rs.getTimestamp("reports.reviewedon"); long reviewdate = reviewtime == null ? -1L : reviewtime.getTime(); String typeName = rs.getString("reporttypes.type"); String informantName = rs.getString("users.name"); String report = rs.getString("reports.report"); String reference2 = rs.getString("reports.reference2"); String review = rs.getString("reports.review"); boolean reviewed = rs.getBoolean("reports.reviewed"); Report r = new Report(id, type, reference, date, informant, reviewedby, reviewdate, typeName, informantName, report, reference2, review, reviewed); result.add(r); } return result; } @Override public boolean closeReport(long id, long uid, String review) throws SQLException { String query = "UPDATE reports SET reviewed = true, reviewedby = ?, review = ?, reviewedon = NOW() WHERE id = ?;"; PreparedStatement statement = db.getPreparedStatement(query); statement.setLong(1, uid); statement.setString(2, review); statement.setLong(3, id); return statement.executeUpdate() == 1; } }