summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimon Rettberg2015-09-03 14:00:21 +0200
committerSimon Rettberg2015-09-03 14:00:21 +0200
commit0c995060bb904c181f5ca58a2f2fbeb7c525d2cd (patch)
treefe12430fb4dd97794e4e376649f012aa45b6f02e
parent[client] removed unused interface implementation (diff)
downloadtutor-module-0c995060bb904c181f5ca58a2f2fbeb7c525d2cd.tar.gz
tutor-module-0c995060bb904c181f5ca58a2f2fbeb7c525d2cd.tar.xz
tutor-module-0c995060bb904c181f5ca58a2f2fbeb7c525d2cd.zip
[server] Improve mail handling, delete old lectures
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/App.java2
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java42
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbLecture.java13
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailGenerator.java6
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/DeleteOldLectures.java64
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/SendExpireWarning.java2
-rw-r--r--dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java2
7 files changed, 116 insertions, 15 deletions
diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/App.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/App.java
index 6a7f0e74..179650d5 100644
--- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/App.java
+++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/App.java
@@ -15,6 +15,7 @@ import org.openslx.bwlp.sat.database.Database;
import org.openslx.bwlp.sat.database.mappers.DbImage;
import org.openslx.bwlp.sat.fileserv.FileServer;
import org.openslx.bwlp.sat.maintenance.DeleteOldImages;
+import org.openslx.bwlp.sat.maintenance.DeleteOldLectures;
import org.openslx.bwlp.sat.maintenance.MailFlusher;
import org.openslx.bwlp.sat.maintenance.SendExpireWarning;
import org.openslx.bwlp.sat.thrift.BinaryListener;
@@ -98,6 +99,7 @@ public class App {
DeleteOldImages.init();
SendExpireWarning.init();
MailFlusher.init();
+ DeleteOldLectures.init();
// Start Thrift Server
Thread t;
diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java
index 8a10fb85..55613554 100644
--- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java
+++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbImage.java
@@ -484,21 +484,26 @@ public class DbImage {
public static void markForDeletion(String... imageVersionIds) throws SQLException, TNotFoundException {
if (imageVersionIds == null || imageVersionIds.length == 0)
return;
+ List<String> affectedList;
try (MysqlConnection connection = Database.getConnection()) {
// Disable version in question
MysqlStatement disableStmt = connection.prepareStatement("UPDATE imageversion SET"
- + " expiretime = UNIX_TIMESTAMP() - 86400, isvalid = 0"
- + " WHERE imageversionid = :versionid");
+ + " expiretime = 1234567890, isvalid = 0" + " WHERE imageversionid = :versionid");
+ affectedList = new ArrayList<>(imageVersionIds.length);
for (String imageVersionId : imageVersionIds) {
disableStmt.setString("versionid", imageVersionId);
- disableStmt.executeUpdate();
+ if (disableStmt.executeUpdate() != 0) {
+ affectedList.add(imageVersionId);
+ }
}
connection.commit();
} catch (SQLException e) {
LOGGER.error("Query failed in DbImage.markForDeletion()", e);
throw e;
}
- updateLatestVersionAsync(imageVersionIds);
+ if (!affectedList.isEmpty()) {
+ updateLatestVersionAsync(affectedList.toArray(new String[affectedList.size()]));
+ }
}
public static void setShareMode(String imageBaseId, ImageBaseWrite newData) throws SQLException {
@@ -573,27 +578,42 @@ public class DbImage {
}
}
- protected static void markValid(MysqlConnection connection, boolean valid,
+ /**
+ * Set validity of given image versions. Returns list of images where the
+ * validity actually changed.
+ *
+ * @param connection
+ * @param valid
+ * @param imageVersion
+ * @return
+ * @throws SQLException
+ */
+ protected static LocalImageVersion[] markValid(MysqlConnection connection, boolean valid,
LocalImageVersion... imageVersion) throws SQLException {
if (imageVersion == null || imageVersion.length == 0)
- return;
+ return new LocalImageVersion[0];
MysqlStatement stmt = connection.prepareStatement("UPDATE imageversion SET isvalid = :valid"
+ " WHERE imageversionid = :imageversionid");
+ stmt.setBoolean("valid", valid);
+ List<LocalImageVersion> retList = new ArrayList<>(imageVersion.length);
for (LocalImageVersion version : imageVersion) {
stmt.setString("imageversionid", version.imageVersionId);
- stmt.setBoolean("valid", valid);
- stmt.executeUpdate();
+ if (stmt.executeUpdate() != 0) {
+ retList.add(version);
+ }
}
+ return retList.toArray(new LocalImageVersion[retList.size()]);
}
public static void markValid(boolean valid, boolean async, LocalImageVersion... imageVersions)
throws SQLException {
if (imageVersions == null || imageVersions.length == 0)
return;
+ LocalImageVersion[] affectedVersions;
try (MysqlConnection connection = Database.getConnection()) {
- markValid(connection, valid, imageVersions);
+ affectedVersions = markValid(connection, valid, imageVersions);
if (!async) {
- updateLatestVersion(connection, imageVersions);
+ updateLatestVersion(connection, affectedVersions);
}
connection.commit();
} catch (SQLException e) {
@@ -601,7 +621,7 @@ public class DbImage {
throw e;
}
if (async) {
- updateLatestVersionAsync(imageVersions);
+ updateLatestVersionAsync(affectedVersions);
}
}
diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbLecture.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbLecture.java
index b49d3ae0..74b2cad3 100644
--- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbLecture.java
+++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/database/mappers/DbLecture.java
@@ -7,6 +7,7 @@ import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
+import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
import org.openslx.bwlp.sat.database.Database;
@@ -466,4 +467,16 @@ public class DbLecture {
}
}
+ public static void deleteOld(int minAgeDays) throws SQLException {
+ try (MysqlConnection connection = Database.getConnection()) {
+ MysqlStatement stmt = connection.prepareStatement("DELETE FROM lecture WHERE enddate < :cutoff");
+ stmt.setLong("cutoff", Util.unixTime() - TimeUnit.DAYS.toSeconds(minAgeDays));
+ stmt.executeUpdate();
+ connection.commit();
+ } catch (SQLException e) {
+ LOGGER.error("Query failed in DbLecture.deleteOld()", e);
+ throw e;
+ }
+ }
+
}
diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailGenerator.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailGenerator.java
index 2a47f5e8..932849b8 100644
--- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailGenerator.java
+++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailGenerator.java
@@ -116,6 +116,8 @@ public class MailGenerator {
newVersion = version;
}
}
+ if (oldVersion == newVersion)
+ return;
String message = "Virtuelle Maschine '" + image.imageName + "':";
if (newVersion == null) {
message += " Die letzte verbliebene Version der VM wurde gelöscht; VM deaktiviert.";
@@ -127,7 +129,7 @@ public class MailGenerator {
} catch (TNotFoundException | SQLException e) {
uploaderName = "(unbekannt)";
}
- message += "\n Neueste Version ist jetzt vom " + Formatter.date(oldVersion.createTime)
+ message += "\n Neueste Version ist jetzt vom " + Formatter.date(newVersion.createTime)
+ " (erstellt von " + uploaderName + ")";
if (oldVersion != null) {
message += "\n Vorherige Verson war vom " + Formatter.date(oldVersion.createTime);
@@ -167,7 +169,7 @@ public class MailGenerator {
}
}
- public static void sendDeletionRemainder(LectureSummary lecture, int days) {
+ public static void sendEndDateRemainder(LectureSummary lecture, int days) {
if (!hasMailConfig())
return;
List<UserInfo> relevantUsers = getUserToMail(lecture);
diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/DeleteOldLectures.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/DeleteOldLectures.java
new file mode 100644
index 00000000..c0a5b65f
--- /dev/null
+++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/DeleteOldLectures.java
@@ -0,0 +1,64 @@
+package org.openslx.bwlp.sat.maintenance;
+
+import java.sql.SQLException;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.log4j.Logger;
+import org.joda.time.DateTime;
+import org.openslx.bwlp.sat.database.mappers.DbLecture;
+import org.openslx.util.QuickTimer;
+import org.openslx.util.QuickTimer.Task;
+
+/**
+ * Delete old image versions (images that reached their expire time).
+ */
+public class DeleteOldLectures implements Runnable {
+
+ private static final Logger LOGGER = Logger.getLogger(DeleteOldLectures.class);
+
+ private static final DeleteOldLectures instance = new DeleteOldLectures();
+
+ private static long blockedUntil = 0;
+
+ /**
+ * Initialize the delete task. This schedules a timer that runs
+ * every 5 minutes. If the hour of day reaches 4, it will fire
+ * the task, and block it from running for the next 12 hours.
+ */
+ public synchronized static void init() {
+ if (blockedUntil != 0)
+ return;
+ blockedUntil = 1;
+ QuickTimer.scheduleAtFixedRate(new Task() {
+ @Override
+ public void fire() {
+ if (blockedUntil > System.currentTimeMillis())
+ return;
+ DateTime now = DateTime.now();
+ if (now.getHourOfDay() != 4 || now.getMinuteOfHour() > 15)
+ return;
+ start();
+ }
+ }, TimeUnit.MINUTES.toMillis(6), TimeUnit.MINUTES.toMillis(7));
+ }
+
+ public synchronized static void start() {
+ if (blockedUntil > System.currentTimeMillis())
+ return;
+ if (Maintenance.trySubmit(instance)) {
+ blockedUntil = System.currentTimeMillis() + TimeUnit.HOURS.toMillis(12);
+ }
+ }
+
+ private DeleteOldLectures() {
+ }
+
+ @Override
+ public void run() {
+ try {
+ DbLecture.deleteOld(365);
+ } catch (SQLException e) {
+ }
+ }
+
+}
diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/SendExpireWarning.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/SendExpireWarning.java
index 53f5941e..ba332523 100644
--- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/SendExpireWarning.java
+++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/maintenance/SendExpireWarning.java
@@ -74,7 +74,7 @@ public class SendExpireWarning implements Runnable {
final int days = (int) ((lecture.endTime - now) / 86400);
LOGGER.debug(lecture.lectureName + " expires in " + days);
if ((lecture.isEnabled && (days == 14 || days == 1)) || (days == 7)) {
- MailGenerator.sendDeletionRemainder(lecture, days);
+ MailGenerator.sendEndDateRemainder(lecture, days);
}
}
}
diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java
index c68e5a8f..be680799 100644
--- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java
+++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/web/WebServer.java
@@ -28,7 +28,7 @@ public class WebServer extends NanoHTTPD {
};
public WebServer(int port) {
- super(port);
+ super("127.0.0.1", port);
}
@Override