From e757d5904d5ee3db61d06b034b3023368e2dd94c Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 13 Jan 2017 13:03:42 +0100 Subject: [server] Refine mail template parsing; fix too many mails being sent for invalid lectures --- .../bwlp/sat/database/mappers/DbLecture.java | 11 ++++--- .../org/openslx/bwlp/sat/mail/MailTemplate.java | 36 ++++++++++++++++++---- 2 files changed, 37 insertions(+), 10 deletions(-) (limited to 'dozentenmodulserver/src/main/java') 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 8a8f6bd9..147b6b8a 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 @@ -250,9 +250,12 @@ public class DbLecture { } protected static List getAllUsingImageVersion(MysqlConnection connection, - String imageVersionId) throws SQLException { - MysqlStatement stmt = connection.prepareStatement(summaryBaseSql - + " WHERE imageversionid = :imageversionid"); + String imageVersionId, boolean enabledOnly) throws SQLException { + String query = summaryBaseSql + " WHERE i.imageversionid = :imageversionid"; + if (enabledOnly) { + query += " AND l.isenabled = 1"; + } + MysqlStatement stmt = connection.prepareStatement(query); stmt.setString("imageversionid", imageVersionId); stmt.setString("userid", "-"); ResultSet rs = stmt.executeQuery(); @@ -398,7 +401,7 @@ public class DbLecture { || (newVersion != null && newVersion.imageVersionId.equals(oldVersion.imageVersionId))) return; // First, get list of lectures using the image version to switch away from - List lectures = getAllUsingImageVersion(connection, oldVersion.imageVersionId); + List lectures = getAllUsingImageVersion(connection, oldVersion.imageVersionId, true); if (lectures.isEmpty()) return; MysqlStatement stmt; diff --git a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailTemplate.java b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailTemplate.java index 6ed88e28..46eec60b 100644 --- a/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailTemplate.java +++ b/dozentenmodulserver/src/main/java/org/openslx/bwlp/sat/mail/MailTemplate.java @@ -40,17 +40,38 @@ public class MailTemplate { return sb.toString(); } - /* + private boolean validVarChar(char c) { + if (c >= 'a' && c <= 'z') + return true; + if (c >= 'A' && c <= 'Z') + return true; + if (c >= '0' && c <= '9') + return true; + return c == '_'; + } + + /** * read the raw string from % to % and the fragments either into snippets or - * variables + * variables. Valid variable names are surrounded are /%[a-zA-Z0-9_]+%/ + * The trailing % might be missing. The name simply ends at the first + * character that is not valid for variable names. So the regexp is actually + * /%[a-zA-Z0-9_]+%?/ + * Why? Compatibility with an old release that had a borked default template + * :( */ private void parseTemplate(String raw) { int i = 0; while (true) { + final int len = raw.length(); int begin = raw.indexOf("%", i); - int end = raw.indexOf("%", begin + 1); + int end = begin + 1; + if (begin != -1) { + while (end < len && validVarChar(raw.charAt(end))) { + end++; + } + } - if (begin == -1 || end == -1) { + if (begin == -1 || end >= len) { /* no variable anymore, so just add a snippet until the end */ /* OR: stray %, add rest as literal text */ String snippet = raw.substring(i); @@ -63,8 +84,11 @@ public class MailTemplate { this.snippets.add(snippet); this.identifiers.add(identifier); - i = end + 1; - + if (raw.charAt(end) == '%') { + i = end + 1; + } else { + i = end; + } } } -- cgit v1.2.3-55-g7522