diff --git a/src/main/java/org/olat/admin/sysinfo/_content/error_list.html b/src/main/java/org/olat/admin/sysinfo/_content/error_list.html index 18ae412383be947201c467db4f981e9c2dc1efa4..1d0c0bc1bf6e63718ba96f4879a47a757f8598a4 100644 --- a/src/main/java/org/olat/admin/sysinfo/_content/error_list.html +++ b/src/main/java/org/olat/admin/sysinfo/_content/error_list.html @@ -1,21 +1,5 @@ -<table border="0" cellspacing="0"> - #set($count = 0) - #foreach ($errormsg in $errormsgs) - #if(($count==1)||($count==4)) - <tr> - #else - <tr bgcolor="#eeeeee"> - #end - - #if($count==4) - #set($count = 0) - <td><hr size="1"></td> - </tr> -<tr bgcolor="#eeeeee"><td>$errormsg</td> -#else - <td>$errormsg</td> +<table class='table table-striped table-bordered'><tbody> +#foreach ($errormsg in $errormsgs) + <tr><td>$errormsg</td></tr> #end -</tr> -#set($count = $count + 1) -#end -</table> \ No newline at end of file +</tbody></table> \ No newline at end of file diff --git a/src/main/java/org/olat/admin/sysinfo/_content/errors.html b/src/main/java/org/olat/admin/sysinfo/_content/errors.html index 99193725db14ba2ebd0fb0e62f839b1df022ffe7..eefdea00b75df566ec38f38a4a781faa54c179b1 100644 --- a/src/main/java/org/olat/admin/sysinfo/_content/errors.html +++ b/src/main/java/org/olat/admin/sysinfo/_content/errors.html @@ -1,4 +1,4 @@ <fieldset><legend>$r.translate("error.title")</legend> $r.render("fields") </fieldset> -$r.render("errors") +$r.render("errors") \ No newline at end of file diff --git a/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java b/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java index b019b3a3be7570543f7c40d282661b50ac81a75c..32a2caa96148ff9bc6899c1ae36812d12579e07d 100644 --- a/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java +++ b/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterAdminControllerCluster.java @@ -118,7 +118,7 @@ public class ClusterAdminControllerCluster extends BasicController { mainVc = createVelocityContainer("cluster"); // information about the cluster nodes - mainVc.contextPut("own_nodeid", "This node is node: '"+clusBus.clusterConfig.getNodeId()+"'"); + mainVc.contextPut("own_nodeid", "This node is node: '"+clusBus.getClusterConfig().getNodeId()+"'"); nodeInfoVc = createVelocityContainer("nodeinfos"); Formatter f = Formatter.getInstance(ureq.getLocale()); @@ -196,7 +196,7 @@ public class ClusterAdminControllerCluster extends BasicController { return o1.getNodeId().compareTo(o2.getNodeId()); }}); nodeInfoVc.contextPut("stats",li); - nodeInfoVc.contextPut("thisNodeId", clusBus.clusterConfig.getNodeId()); + nodeInfoVc.contextPut("thisNodeId", clusBus.getClusterConfig().getNodeId()); mainVc.contextPut("eventBusListener", clusBus.toString()); mainVc.contextPut("busListenerInfos", clusBus.getBusInfosAsString()); } diff --git a/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterEventBus.java b/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterEventBus.java index 804cd51292189b8dcce63fbb6c257964f8d35686..80026c1087a2804f10189501c9abedde6bd73681 100644 --- a/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterEventBus.java +++ b/src/main/java/org/olat/commons/coordinate/cluster/jms/ClusterEventBus.java @@ -67,11 +67,11 @@ public class ClusterEventBus extends AbstractEventBus implements MessageListener //ores helper is limited to 50 character, so truncate it static final OLATResourceable CLUSTER_CHANNEL = OresHelper.createOLATResourceableType(ClusterEventBus.class.getName().substring(0, 50)); - ClusterConfig clusterConfig; + private ClusterConfig clusterConfig; // settings - long sendInterval = 1000; // 1000 miliseconds between each "ping/alive/info" message, can be set using spring - long jmsMsgDelayLimit = 5000; // max duration of ClusterInfoEvent send-receive time in ms + private long sendInterval = 1000; // 1000 miliseconds between each "ping/alive/info" message, can be set using spring + private long jmsMsgDelayLimit = 5000; // max duration of ClusterInfoEvent send-receive time in ms // counters private long latestSentMsgId = -1; @@ -467,7 +467,11 @@ public class ClusterEventBus extends AbstractEventBus implements MessageListener log.warn("Exception in stop ClusteredSearchProvider, ",e); } } - + + public ClusterConfig getClusterConfig() { + return clusterConfig; + } + /** * [used by spring] */ diff --git a/src/main/java/org/olat/core/commons/persistence/_spring/databaseCorecontext.xml b/src/main/java/org/olat/core/commons/persistence/_spring/databaseCorecontext.xml index 0f70304cad794f6edcd9b1ffef0017c8493288c9..46ef22209f4470d2596342b7702fb082e3712c9d 100644 --- a/src/main/java/org/olat/core/commons/persistence/_spring/databaseCorecontext.xml +++ b/src/main/java/org/olat/core/commons/persistence/_spring/databaseCorecontext.xml @@ -178,7 +178,7 @@ <prop key="hibernate.hikari.minimumIdle">4</prop> <prop key="hibernate.hikari.idleTimeout">1800000</prop> <prop key="hibernate.hikari.autoCommit">false</prop> - <prop key="hibernate.hikari.leakDetectionThreshold">120000</prop> + <prop key="hibernate.hikari.leakDetectionThreshold">${db.hibernate.hikari.leakDetectionThreshold:120000}</prop> <prop key="hibernate.hikari.transactionIsolation">TRANSACTION_READ_COMMITTED</prop> <prop key="hibernate.hikari.registerMbeans">true</prop> </props> @@ -226,4 +226,4 @@ </bean> -</beans> \ No newline at end of file +</beans> diff --git a/src/main/java/org/olat/core/logging/LogFileParser.java b/src/main/java/org/olat/core/logging/LogFileParser.java index 3b09a0023ea7dbeb9cfdb331ac2cc199a6b36c16..317a6a0477f57b62617dcb198a0126e0e63e1147 100644 --- a/src/main/java/org/olat/core/logging/LogFileParser.java +++ b/src/main/java/org/olat/core/logging/LogFileParser.java @@ -35,6 +35,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; +import java.util.List; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.Logger; @@ -100,48 +101,52 @@ public class LogFileParser { } /** - * extracts the errormessage from a line in the logfile and formats it for the - * html + * Extracts the error message from a line in the log file and formats it for the + * html. * - * @param s - * @return errormsg + * @param s The splited error + * @return The error message as a string */ - private static String extractErrorAsHTML(String s[]) { - StringBuilder sb = new StringBuilder(); + private static String extractErrorAsHTML(String[] s) { + StringBuilder sb = new StringBuilder(2048); + sb.append("<table class='table'><tbody>"); if (s.length == 6) { // before refactoring of logging.Tracing - sb.append("<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">"); - sb.append("<tr><td valign=\"top\"><b>Date </b></td><td>" + Formatter.truncate(s[0].trim(), 20) + "</td></tr>"); - sb.append("<tr><td valign=\"top\"><b>Error# </td><td><font color=\"red\"><b>" + s[1].trim() + "</font></td></tr>"); - sb.append("<tr><td valign=\"top\"><b>Identity </b></td><td>" + s[3].trim() + "</td></tr>"); - sb.append("<tr><td valign=\"top\"><b>Category/Class </b></td><td>" + s[2].trim() + "</td></tr>"); - sb.append("<tr><td valign=\"top\"><b>Log msg </b></td><td>" + s[4].trim() + "</td></tr>"); - sb.append("<tr><td valign=\"top\"><b>Cause </b></td><td>" - + s[5].trim().replaceAll(" at ", "<br />at ").replaceAll(">>>", "<br /><br />>>>") + "</td></tr>"); - sb.append("</table>"); + sb.append("<tr><th>Date</th><td>").append(Formatter.truncate(s[0].trim(), 20)).append("</td></tr>"); + sb.append("<tr><th>Error</th><td class='danger'>").append(s[1].trim()).append("</td></tr>"); + sb.append("<tr><th>Identity</th><td>").append(s[3].trim()).append("</td></tr>"); + sb.append("<tr><th>Category/Class</th><td>").append(s[2].trim()).append("</td></tr>"); + sb.append("<tr><th>Log msg</th><td>").append(s[4].trim()).append("</td></tr>"); + sb.append("<tr><th>Cause</th><td>").append(s[5].trim().replace(" at ", "<br>at ").replace(">>>", "<br><br>>>>")).append("</td></tr>"); } else if (s.length == 9) { // the new Tracing - sb.append("<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">"); - sb.append("<tr><td valign=\"top\"><b>Date </b></td><td>" + Formatter.truncate(s[0].trim(), 20) + "</td></tr>"); - sb.append("<tr><td valign=\"top\"><b>Error# </td><td><font color=\"red\"><b>" + s[1].trim() + "</font></td></tr>"); - sb.append("<tr><td valign=\"top\"><b>Identity </b></td><td>" + s[3].trim() + "</td></tr>"); - sb.append("<tr><td valign=\"top\"><b>Category/Class </b></td><td>" + s[2].trim() + "</td></tr>"); - sb.append("<tr><td valign=\"top\"><b>Remote IP </b></td><td>" + s[4].trim() + "</td></tr>"); - sb.append("<tr><td valign=\"top\"><b>Referer </b></td><td>" + s[5].trim() + "</td></tr>"); - sb.append("<tr><td valign=\"top\"><b>User-Agent </b></td><td>" + s[6].trim() + "</td></tr>"); - sb.append("<tr><td valign=\"top\"><b>Log msg </b></td><td>" + s[7].trim() + "</td></tr>"); - sb.append("<tr><td valign=\"top\"><b>Cause </b></td><td>" - + s[8].trim().replaceAll(" at ", "<br />at ").replaceAll(">>>", "<br /><br />>>>") + "</td></tr>"); - sb.append("</table>"); + sb.append("<tr><th>Date</th><td>").append(Formatter.truncate(s[0].trim(), 20)).append("</td></tr>"); + sb.append("<tr><th>Error</th><td class='danger'>").append( s[1].trim()).append("</td></tr>"); + sb.append("<tr><th>Identity</th><td>").append(s[3].trim()).append("</td></tr>"); + sb.append("<tr><th>Category/Class</th><td>").append(s[2].trim()).append("</td></tr>"); + sb.append("<tr><th>Remote IP</th><td>").append(s[4].trim()).append("</td></tr>"); + sb.append("<tr><th>Referer</th><td>").append(s[5].trim()).append("</td></tr>"); + sb.append("<tr><th>User-Agent</th><td>").append(s[6].trim()).append("</td></tr>"); + sb.append("<tr><th>Log msg</th><td>").append( s[7].trim()).append("</td></tr>"); + sb.append("<tr><th>Cause</th><td>").append(s[8].trim().replace(" at ", "<br>at ").replace(">>>", "<br><br>>>>")).append("</td></tr>"); } else { - throw new AssertException("Unknown Logfile format"); + sb.append("<tr><th>Log</th><td colspan='8'>"); + for(String t:s) { + String text = t == null ? "" : t.trim(); + if(StringHelper.containsNonWhitespace(text)) { + sb.append(text).append("<br>"); + } + } + sb.append("</td></tr>"); } + sb.append("</tbody></table>"); + return sb.toString(); } /** - * extracts the errormessage from a line in the logfile and formats it as text + * Extracts the error message from a line in the log file and formats it as text * * @param s * @return errormsg @@ -156,7 +161,7 @@ public class LogFileParser { sb.append("Remote IP: " + s[4].trim() + "\n"); sb.append("Referer: " + s[5].trim() + "\n"); sb.append("User-Agent: " + s[6].trim() + "\n"); - sb.append("Exception: " + s[7].trim().replaceAll(" at ", "\nat ").replaceAll(">>>", "\n\n")); + sb.append("Exception: " + s[7].trim().replace(" at ", "\nat ").replace(">>>", "\n\n")); } else { for(String st:s) { sb.append("Raw msg: " + st + "\n"); @@ -179,51 +184,41 @@ public class LogFileParser { } /** - * looks through the logfile + * Looks through the log file. * - * @param s - * @param dd requested day - * @param mm requested month - * @param yyyy requested yyyy - * @return the first found errormessage + * @param errorNumber The error number to search for + * @param date The date (optional) + * @param asHTML Result as HTML or not + * @return A list of error messages */ - public static Collection<String> getError(String errorNumber, Date date, boolean asHTML) { - + public static List<String> getError(String errorNumber, Date date, boolean asHTML) { if (logfilepathBase == null) { //this is null when olat is setup with an empty olat.local.properties file and no log.dir path is set. return Collections.emptyList(); } + + List<String> errormsg = new ArrayList<>(); + + File logFile = getLogFile(date, new SimpleDateFormat("yyyy-MM-dd")); + if(logFile == null) { + logFile = getLogFile(date, new SimpleDateFormat("dd MM yyyy")); + } + + if(logFile == null || !logFile.exists() || !logFile.canRead()) { + String logFilePath = logFile == null ? "???" : logFile.getAbsolutePath(); + errormsg.add("logfile <strong>" + logFilePath + "</strong> does not exist or unable to read from"); + return errormsg; + } String line; String line2; String memoryline = "empty"; String[] em = new String[10]; - Collection<String> errormsg = new ArrayList<>(); - - SimpleDateFormat sdb = new SimpleDateFormat("dd MM yyyy"); - - String logfilepath; - if(date == null) { - logfilepath = logfilepathBase; - } else { - String today = sdb.format(new Date()); - String reqdate = sdb.format(date); - if (today.equals(reqdate)) { - logfilepath = logfilepathBase; - } else { - logfilepath = logfilepathBase + "." + reqdate; - } - log.info("logfilepath changed to " + logfilepath + " (today: " + today + ", requested date:" + reqdate + ")"); - } - int counter = linecount; int founderror = 0; - final File logFile = new File(logfilepath); - if(!logFile.exists() || !logFile.canRead()){ - errormsg.add("logfile <b>"+logfilepath+"</b> does not exist or unable to read from"); - return errormsg; - } - + int counter = linecount; + String logFilePath = logFile.getAbsolutePath(); + try(BufferedReader br = new BufferedReader(new FileReader(logFile))) { while ((line = br.readLine()) != null) { if (counter == 0) { @@ -235,7 +230,7 @@ public class LogFileParser { } else if ( line.matches(matchError) || line.matches(matchWarn) ) { line2 = line.replaceAll("[/^]", "/"); em = line2.split("/%/"); - if (em[1].trim().startsWith(errorNumber)) { + if (em[1].trim().contains(errorNumber)) { founderror++; if (asHTML) { line2 = extractErrorAsHTML(em); @@ -259,12 +254,29 @@ public class LogFileParser { } if (founderror == 0){ - errormsg.add("no error with number "+errorNumber+" found in "+logfilepath); + errormsg.add("no error with number " + errorNumber + " found in " + logFilePath); } - return errormsg; } catch (IOException e) { - throw new OLATRuntimeException("error reading OLAT error log at " + logfilepath, e); + throw new OLATRuntimeException("error reading OLAT error log at " + logFilePath, e); } } + + private static File getLogFile(Date date, SimpleDateFormat sdb) { + String logfilepath; + if(date == null) { + logfilepath = logfilepathBase; + } else { + String today = sdb.format(new Date()); + String reqdate = sdb.format(date); + if (today.equals(reqdate)) { + logfilepath = logfilepathBase; + } else { + logfilepath = logfilepathBase + "." + reqdate; + } + log.info("logfilepath changed to {} (today: {}, requested date:{})", logfilepath, today, reqdate); + } + + return new File(logfilepath); + } } diff --git a/src/main/java/org/olat/ims/qti21/manager/QTI21StatisticsManagerImpl.java b/src/main/java/org/olat/ims/qti21/manager/QTI21StatisticsManagerImpl.java index 6fc8aaed6b72960f3600789bad2bc7091ddbca8d..8e54fffece6a436effee5bab587c49a0cbeb88df 100644 --- a/src/main/java/org/olat/ims/qti21/manager/QTI21StatisticsManagerImpl.java +++ b/src/main/java/org/olat/ims/qti21/manager/QTI21StatisticsManagerImpl.java @@ -32,8 +32,10 @@ import java.util.concurrent.atomic.DoubleAdder; import javax.persistence.TypedQuery; +import org.apache.logging.log4j.Logger; import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.PersistenceHelper; +import org.olat.core.logging.Tracing; import org.olat.ims.qti.statistics.manager.Statistics; import org.olat.ims.qti.statistics.model.StatisticAssessment; import org.olat.ims.qti.statistics.model.StatisticsItem; @@ -87,6 +89,8 @@ import uk.ac.ed.ph.jqtiplus.value.StringValue; @Service public class QTI21StatisticsManagerImpl implements QTI21StatisticsManager { + private static final Logger log = Tracing.createLoggerFor(QTI21StatisticsManagerImpl.class); + @Autowired private DB dbInstance; @@ -529,8 +533,9 @@ public class QTI21StatisticsManagerImpl implements QTI21StatisticsManager { for(TextEntryInteraction interaction:interactions) { Identifier responseIdentifier = interaction.getResponseIdentifier(); ResponseDeclaration responseDeclaration = item.getResponseDeclaration(responseIdentifier); - - if(responseDeclaration.hasBaseType(BaseType.STRING)) { + if(responseDeclaration == null) { + log.warn("Missing response declaration {}", responseIdentifier); + } else if(responseDeclaration.hasBaseType(BaseType.STRING)) { TextEntryInteractionStatistics stats = getTextEntryInteractionSettings(responseIdentifier, responseDeclaration); optionMap.put(responseIdentifier.toString(), stats); options.add(stats); @@ -553,7 +558,9 @@ public class QTI21StatisticsManagerImpl implements QTI21StatisticsManager { response = response.substring(1, response.length() - 1); } - if(stats.matchResponse(response)) { + if(stats == null) { + // missing response declaration + } else if(stats.matchResponse(response)) { stats.addCorrect(count.longValue()); } else { stats.addIncorrect(count.longValue()); diff --git a/src/main/java/org/olat/modules/forms/model/jpa/CalculatedLong.java b/src/main/java/org/olat/modules/forms/model/jpa/CalculatedLong.java index 71ad86a5f09078af757e1644133012188738444e..2f9636f9dcfe7248e69cb389e0fc0f2632e6a156 100644 --- a/src/main/java/org/olat/modules/forms/model/jpa/CalculatedLong.java +++ b/src/main/java/org/olat/modules/forms/model/jpa/CalculatedLong.java @@ -44,7 +44,7 @@ public class CalculatedLong { } public CalculatedLong(String identifier, BigDecimal subIdentifier, long value) { - this(identifier, subIdentifier.toPlainString(), value); + this(identifier, trimZerosFromEnd(subIdentifier.toPlainString()), value); } public CalculatedLong(String identifier, String subIdentifier, long value) { @@ -65,5 +65,14 @@ public class CalculatedLong { public long getValue() { return value; } + + private static String trimZerosFromEnd(String value) { + int len = value.length(); + int st = 0; + while ((st < len) && (value.charAt(len - 1) == '0' || value.charAt(len - 1) == '.')) { + len--; + } + return value.substring(0, len); + } } diff --git a/src/main/java/org/olat/modules/forms/ui/TextInputController.java b/src/main/java/org/olat/modules/forms/ui/TextInputController.java index a96a1bdea2fca1cebae249e6de3828640b1bebf8..0358a9e23f298b5ad65536f3876e0a1a3f742c34 100644 --- a/src/main/java/org/olat/modules/forms/ui/TextInputController.java +++ b/src/main/java/org/olat/modules/forms/ui/TextInputController.java @@ -21,6 +21,7 @@ package org.olat.modules.forms.ui; import java.math.BigDecimal; +import org.olat.core.commons.persistence.DB; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.TextAreaElement; @@ -54,6 +55,8 @@ public class TextInputController extends FormBasicController implements Evaluati private boolean singleRow; private EvaluationFormResponse response; + @Autowired + private DB dbInstance; @Autowired private EvaluationFormManager evaluationFormManager; @@ -105,14 +108,20 @@ public class TextInputController extends FormBasicController implements Evaluati protected boolean validateFormLogic(UserRequest ureq) { boolean allOk = super.validateFormLogic(ureq); + singleRowEl.clearError(); if (textInput.isNumeric()) { String val = singleRowEl.getValue(); if(StringHelper.containsNonWhitespace(val)) { - try { - Double.parseDouble(val); - } catch (NumberFormatException e) { - singleRowEl.setErrorKey("error.no.number", null); + if (dbInstance.isMySQL() && val.length() > 55) { + singleRowEl.setErrorKey("error.number.too.large", null); allOk = false; + } else { + try { + Double.parseDouble(val); + } catch (NumberFormatException e) { + singleRowEl.setErrorKey("error.no.number", null); + allOk = false; + } } } } diff --git a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_de.properties index ac26024a3e4dda8d52f73fbcff5dfb0e0fab7888..a2e7c705d9738e4f0d5a95d2950c6c397f9cae5f 100644 --- a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_de.properties @@ -31,6 +31,7 @@ end.label=End error.cannot.save=Speichern fehlgeschlagen error.no.number=Falsches Zahlenformat. Beispiele\: 1.0, 0.5, 0.2 error.outside.range=Der Wert muss zwischen {0} und {1} liegen. +error.number.too.large=Die Zahl ist zu gross. error.range.overlapping=Zwei Wertebereiche \u00FCberlappen sich. error.wrong.int=Falsches Zahlenformat. Beispiele\: 1, 5, 10 evaluation.anonymous= Dies ist eine anonyme Umfrage, die Umfrageantworten sind anonymisiert. Es werden keine pers\u00F6nlichen Daten \u00FCber Sie gespeichert, es sei denn, es wird ausdr\u00FCcklich danach gefragt (z. B. Alter, Geschlecht). Auch die IP-Adresse des von Ihnen verwendeten PC wird nicht gespeichert. Es gibt somit keinen Weg, die Umfrageergebnisse mit Ihren Daten zusammenzuf\u00FChren. diff --git a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_en.properties index 6bca28ac4e62a8dc686520e1a07e5c694f5f6d00..ad67fe4624ccfe05510937b81d9f306cb3ff6a8a 100644 --- a/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/modules/forms/ui/_i18n/LocalStrings_en.properties @@ -30,6 +30,7 @@ end.label=End error.cannot.save=Error while saving. error.no.number=Wrong number format. Example\: 1.0, 0.5, 0.2 error.outside.range=The value has to be between {0} and {1}. +error.number.too.large=The number is too large. error.range.overlapping=Two ranges are overlapping. error.wrong.int=Wrong numerical format. Examples\: 1, 5, 10 evaluation.anonymous=This is an anonymous survey. No personal information about you will be stored unless explicitly requested (e.g. age, gender). Also, the IP address of your PC is not saved. There is no way to merge the survey results with your data. diff --git a/src/main/java/org/olat/upgrade/_spring/databaseUpgradeContext.xml b/src/main/java/org/olat/upgrade/_spring/databaseUpgradeContext.xml index 1bb3f61782243b19bff33da445caaa57e1f66c07..fdfdcd32f153408cf7ba6adb97ad213ba0c73d99 100644 --- a/src/main/java/org/olat/upgrade/_spring/databaseUpgradeContext.xml +++ b/src/main/java/org/olat/upgrade/_spring/databaseUpgradeContext.xml @@ -204,6 +204,10 @@ <constructor-arg index="0" value="OLAT_14.1.3" /> <property name="alterDbStatements" value="alter_14_1_x_to_14_1_3.sql" /> </bean> + <bean id="database_upgrade_14_1_6" class="org.olat.upgrade.DatabaseUpgrade"> + <constructor-arg index="0" value="OLAT_14.1.6" /> + <property name="alterDbStatements" value="alter_14_1_x_to_14_1_6.sql" /> + </bean> </list> </property> </bean> diff --git a/src/main/resources/database/mysql/alter_14_1_x_to_14_1_6.sql b/src/main/resources/database/mysql/alter_14_1_x_to_14_1_6.sql new file mode 100644 index 0000000000000000000000000000000000000000..ce57689abdb3858c21e7d7327f795d42072869cc --- /dev/null +++ b/src/main/resources/database/mysql/alter_14_1_x_to_14_1_6.sql @@ -0,0 +1,2 @@ +-- Evaluation form +alter table o_eva_form_response modify column e_numericalresponse decimal(65,10) null; \ No newline at end of file diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql index 5f619e2b8cd9de53a99aa63044f1c2d7b85f270c..22048c3a2ea89d59ac61669ab838beaeaca49da9 100644 --- a/src/main/resources/database/mysql/setupDatabase.sql +++ b/src/main/resources/database/mysql/setupDatabase.sql @@ -2085,7 +2085,7 @@ create table o_eva_form_response ( lastmodified datetime not null, e_no_response bit default 0, e_responseidentifier varchar(64) not null, - e_numericalresponse decimal default null, + e_numericalresponse decimal(65,10) default null, e_stringuifiedresponse mediumtext, e_file_response_path varchar(4000), fk_session bigint not null, diff --git a/src/main/resources/database/oracle/alter_14_1_x_to_14_1_6.sql b/src/main/resources/database/oracle/alter_14_1_x_to_14_1_6.sql new file mode 100644 index 0000000000000000000000000000000000000000..3ec35e08629edf8331a9de39ce97393a41355a71 --- /dev/null +++ b/src/main/resources/database/oracle/alter_14_1_x_to_14_1_6.sql @@ -0,0 +1,2 @@ +-- Evaluation form +-- nothing to do \ No newline at end of file diff --git a/src/main/resources/database/postgresql/alter_14_1_x_to_14_1_6.sql b/src/main/resources/database/postgresql/alter_14_1_x_to_14_1_6.sql new file mode 100644 index 0000000000000000000000000000000000000000..3ec35e08629edf8331a9de39ce97393a41355a71 --- /dev/null +++ b/src/main/resources/database/postgresql/alter_14_1_x_to_14_1_6.sql @@ -0,0 +1,2 @@ +-- Evaluation form +-- nothing to do \ No newline at end of file diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties index 8cbe38bc16a59d9a2f89d0bcf8fd867dad7e723c..c02ac6eb815d7ae4830d5991e73346f43d517c2e 100644 --- a/src/main/resources/serviceconfig/olat.properties +++ b/src/main/resources/serviceconfig/olat.properties @@ -1258,8 +1258,8 @@ ldap.learningResourceManagerRoleValue= # Build properties ##### application.name=OpenOlat -build.version=14.1.5 -build.identifier=openolat1415-dev +build.version=14.1.6 +build.identifier=openolat1416-dev build.repo.revision=local-devel ##### diff --git a/src/test/java/org/olat/shibboleth/manager/DifferenceCheckerTest.java b/src/test/java/org/olat/shibboleth/manager/DifferenceCheckerTest.java index ac5931ca86a6d2725843fd660203aba70a9f917b..37b136feb5880ea2ef6b7d0c983e7fec0c5cafb1 100644 --- a/src/test/java/org/olat/shibboleth/manager/DifferenceCheckerTest.java +++ b/src/test/java/org/olat/shibboleth/manager/DifferenceCheckerTest.java @@ -125,7 +125,7 @@ public class DifferenceCheckerTest { @Test public void shouldDeleteNullIfNotConfigured() { - when(shibbolethModuleMock.getDeleteIfNull().get(ATTRIBUTE_NAME)).thenThrow(Exception.class); + when(shibbolethModuleMock.getDeleteIfNull().get(ATTRIBUTE_NAME)).thenThrow(new RuntimeException()); boolean isDifferent = sut.isDifferent(ATTRIBUTE_NAME, null, OLAT_ONLY);