From 523c541d77cace2d4e3d2606c71d5afd0a4298e5 Mon Sep 17 00:00:00 2001
From: gnaegi <none@none>
Date: Tue, 9 Oct 2012 14:19:23 +0200
Subject: [PATCH] OO-374 read cron expression configuration from config to
 trigger full text indexer

---
 .../service/indexer/IndexCronGenerator.java   | 28 ++++++++++++++++++-
 .../resources/serviceconfig/olat.properties   | 19 ++++++++-----
 .../scheduler/_spring/olatextconfig.xml       |  1 +
 3 files changed, 40 insertions(+), 8 deletions(-)

diff --git a/src/main/java/org/olat/search/service/indexer/IndexCronGenerator.java b/src/main/java/org/olat/search/service/indexer/IndexCronGenerator.java
index 559ca469aa4..90d35516aad 100644
--- a/src/main/java/org/olat/search/service/indexer/IndexCronGenerator.java
+++ b/src/main/java/org/olat/search/service/indexer/IndexCronGenerator.java
@@ -19,6 +19,9 @@
  */
 package org.olat.search.service.indexer;
 
+import org.olat.core.logging.LogDelegator;
+import org.olat.core.util.StringHelper;
+import org.quartz.CronExpression;
 import org.springframework.beans.factory.FactoryBean;
 
 /**
@@ -30,10 +33,11 @@ import org.springframework.beans.factory.FactoryBean;
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  */
 //fxdiff FXOLAT-221: start indexer at different times for each instance
-public class IndexCronGenerator implements FactoryBean<String> {
+public class IndexCronGenerator extends LogDelegator implements FactoryBean<String> {
 	
 	private int tomcatId;
 	private String enabled;
+	private String cronExpression;
 	
 	/**
 	 * [used by Spring]
@@ -51,11 +55,33 @@ public class IndexCronGenerator implements FactoryBean<String> {
 		this.enabled = enabled;
 	}
 	
+	/**
+	 * [used by Spring]
+	 * @param cronExpression
+	 */
+	public void setCronExpression(String cronExpression) {
+		if (CronExpression.isValidExpression(cronExpression)) {
+			this.cronExpression = cronExpression;			
+		} else {
+			if (StringHelper.containsNonWhitespace(cronExpression) && isCronEnabled()) {
+				// was not empty, so someone tried to set someting here, let user know that it was garbage
+				logWarn("Configured cron expression is not valid::"
+						+ cronExpression
+						+ " check your search.indexing.cronjob.expression property",
+						null);
+			}
+			this.cronExpression = null;
+		}
+	}
+	
 	public boolean isCronEnabled() {
 		return "enabled".equals(enabled);
 	}
 	
 	public String getCron() {
+		if (cronExpression != null) {
+			return cronExpression;
+		}
 		int shiftHours = tomcatId % 4;
 		String hours;
 		switch(shiftHours) {
diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties
index 0d33989627a..d3ffa32b9aa 100644
--- a/src/main/resources/serviceconfig/olat.properties
+++ b/src/main/resources/serviceconfig/olat.properties
@@ -496,18 +496,23 @@ usersearch.maxResults.values=-1,20,50
 ########################################################################
 # Fulltext Search settings
 ########################################################################
+# Enable search-service for only one node per cluster [ enabled | disabled ]
+search.service=enabled
+# The full text indexer can be configured in two ways: 
+# 1) Start indexer during startup and restart periodicaly in a given interval
 generate.index.at.startup=false
+# but only if startup is during the restart window...
 restart.window.start=0
 restart.window.end=24
-# Enable search-service for only one node per cluster [ enabled | disabled ]
-search.service=enabled
-#fxdiff FXOLAT-221: start indexer at different times for each instance
+# Interval in millisecond after which the indexer should run again. O means: do not run again
 search.indexing.restart.interval=0
-# Enable triggering indexer via cron-job instead at startup [ enabled | disabled ]
+# 2) Enable triggering indexer via cron-job instead at startup [ enabled | disabled ]
 # When enabled , configure 'generate.index.at.startup=false'
-search.indexing.cronjob=disabled
-# Example '0 0 18 * * ?' start indexer at 18:00 ever day
-search.indexing.cronjob.expression=0 0 18 * * ?
+search.indexing.cronjob=enabled
+# Example '0 0 3 * * ?' start indexer at 03:00 ever day. If you do not provide a valid 
+# expression but have set search.indexing.cronjob=enabled, the system will generate a 
+# cron expression that triggers the indexer every four hour depending on your tomcat.id variable
+search.indexing.cronjob.expression=0 0 3 * * ?
 
 ########################################################################
 # REST API
diff --git a/src/main/resources/serviceconfig/org/olat/core/commons/scheduler/_spring/olatextconfig.xml b/src/main/resources/serviceconfig/org/olat/core/commons/scheduler/_spring/olatextconfig.xml
index f82d5c49361..a8d4e165532 100644
--- a/src/main/resources/serviceconfig/org/olat/core/commons/scheduler/_spring/olatextconfig.xml
+++ b/src/main/resources/serviceconfig/org/olat/core/commons/scheduler/_spring/olatextconfig.xml
@@ -166,6 +166,7 @@ requests and therefore the session in never invalidated -->
 	<bean id="searchIndexCronGenerator" class="org.olat.search.service.indexer.IndexCronGenerator">
 		<property name="tomcatId" value="${tomcat.id}" />
 		<property name="enabled" value="${search.indexing.cronjob}" />
+		<property name="cronExpression" value="${search.indexing.cronjob.expression}" />
 	</bean>
 	
 	<bean id="org.olat.search.job.enabled" class="org.springframework.scheduling.quartz.JobDetailBean" lazy-init="true">
-- 
GitLab