From c8ecb6cf887a393f3d419871b5794473fbe6ecc9 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Fri, 23 Jan 2015 10:41:13 +0100
Subject: [PATCH] no-jira: calculate last full index time from file at start of
 the instance

---
 .../org/olat/admin/search/_content/index.html |  2 +-
 .../restapi/system/IndexerWebService.java     |  2 +-
 .../service/indexer/FullIndexerStatus.java    | 18 ++++++--
 .../service/indexer/OlatFullIndexer.java      | 46 +++++++++++++++++--
 4 files changed, 56 insertions(+), 12 deletions(-)

diff --git a/src/main/java/org/olat/admin/search/_content/index.html b/src/main/java/org/olat/admin/search/_content/index.html
index 6f1449d7fae..da99e3fed2d 100644
--- a/src/main/java/org/olat/admin/search/_content/index.html
+++ b/src/main/java/org/olat/admin/search/_content/index.html
@@ -10,7 +10,7 @@
 	$r.translate("fullindexer.label.running.indexer") : $searchstatus.fullIndexerStatus.NumberRunningFolderIndexer<br />
 	$r.translate("fullindexer.label.available.indexer") : $searchstatus.fullIndexerStatus.NumberAvailableFolderIndexer<br />	
 	<br />
-	$r.translate("fullindexer.label.finished") : $searchstatus.fullIndexerStatus.lastFullIndexTime<br />
+	$r.translate("fullindexer.label.finished") : #if($searchstatus.fullIndexerStatus.lastFullIndexTime > 1) $searchstatus.fullIndexerStatus.lastFullIndexDateString #else - #end<br />
 	$r.translate("fullindexer.label.time") : $searchstatus.fullIndexerStatus.indexingTime ms<br />
 	$r.translate("fullindexer.label.size") : $searchstatus.fullIndexerStatus.IndexSize
 </fieldset>
diff --git a/src/main/java/org/olat/restapi/system/IndexerWebService.java b/src/main/java/org/olat/restapi/system/IndexerWebService.java
index b3b3067fb5a..ad614a5cf1d 100644
--- a/src/main/java/org/olat/restapi/system/IndexerWebService.java
+++ b/src/main/java/org/olat/restapi/system/IndexerWebService.java
@@ -131,7 +131,7 @@ public class IndexerWebService {
 			stats.setDocumentQueueSize(fStatus.getDocumentQueueSize());
 			stats.setRunningFolderIndexerCount(fStatus.getNumberRunningFolderIndexer());
 			stats.setAvailableFolderIndexerCount(fStatus.getNumberAvailableFolderIndexer());
-			stats.setLastFullIndexTime(fStatus.getLastFullIndexTime());
+			stats.setLastFullIndexTime(fStatus.getLastFullIndexDateString());
 			stats.setStatus(status.getStatus());
 		} else {
 			stats.setStatus("disabled");
diff --git a/src/main/java/org/olat/search/service/indexer/FullIndexerStatus.java b/src/main/java/org/olat/search/service/indexer/FullIndexerStatus.java
index 6381d19687f..57cf3c24469 100644
--- a/src/main/java/org/olat/search/service/indexer/FullIndexerStatus.java
+++ b/src/main/java/org/olat/search/service/indexer/FullIndexerStatus.java
@@ -75,14 +75,22 @@ public class FullIndexerStatus {
 	/**
 	 * @return Returns the lastFullIndexTime.
 	 */
-	public String getLastFullIndexTime() {
-		if (lastFullIndexTime != 0) {
+	public String getLastFullIndexDateString() {
+		if (lastFullIndexTime > 0) {
 			return new Date(lastFullIndexTime).toString();
 		} else {
 			// not finished yet
 			return "-";
 		}
 	}
+	
+	public long getLastFullIndexTime() {
+		return lastFullIndexTime;
+	}
+	
+	public void setLastFullIndexTime(long time) {
+		lastFullIndexTime = time;
+	}
 
 	/**
 	 * @return Returns the status.
@@ -116,7 +124,7 @@ public class FullIndexerStatus {
    * reset full-index document-counter and all document-counters. 
    */
 	public void indexingStarted() {
-		this.fullIndexStartedAt = System.currentTimeMillis();
+		fullIndexStartedAt = System.currentTimeMillis();
 		setStatus(STATUS_RUNNING);
 		setDocumentCount(0);//Reset FullIndex-DocumentCounter
 		resetAllDocumentCounters();
@@ -138,8 +146,8 @@ public class FullIndexerStatus {
    * Indexing finished. Set end time, calculate duration and set status to 'finished'. 
    */
 	public void indexingFinished() {
-		this.lastFullIndexTime = System.currentTimeMillis();
-		indexingTime = this.lastFullIndexTime - this.fullIndexStartedAt;
+		lastFullIndexTime = System.currentTimeMillis();
+		indexingTime = lastFullIndexTime - fullIndexStartedAt;
 		setStatus(STATUS_FINISHED);
 	}
 
diff --git a/src/main/java/org/olat/search/service/indexer/OlatFullIndexer.java b/src/main/java/org/olat/search/service/indexer/OlatFullIndexer.java
index 7506fd6bce8..05b6e422d79 100644
--- a/src/main/java/org/olat/search/service/indexer/OlatFullIndexer.java
+++ b/src/main/java/org/olat/search/service/indexer/OlatFullIndexer.java
@@ -27,10 +27,17 @@ package org.olat.search.service.indexer;
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.nio.file.attribute.FileTime;
 import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 import java.util.Vector;
+import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.lucene.LucenePackage;
 import org.apache.lucene.analysis.Analyzer;
@@ -65,6 +72,7 @@ public class OlatFullIndexer {
 	private static final int MAX_SIZE_QUEUE = 500;
 	private int numberIndexWriter = 5;
 
+	private String  indexPath;
 	private String  tempIndexPath;
 
 	/**
@@ -116,17 +124,45 @@ public class OlatFullIndexer {
 		this.index = index;
 		this.mainIndexer = mainIndexer;
 		this.coordinatorManager = coordinatorManager;
+		indexPath = searchModuleConfig.getFullIndexPath();
 		tempIndexPath = searchModuleConfig.getFullTempIndexPath();
 		indexInterval = searchModuleConfig.getIndexInterval();
 		numberIndexWriter = searchModuleConfig.getNumberIndexWriter();
 		documentsPerInterval = searchModuleConfig.getDocumentsPerInterval();
 		ramBufferSizeMB = searchModuleConfig.getRAMBufferSizeMB();
-		fullIndexerStatus = new FullIndexerStatus(numberIndexWriter);    
+		fullIndexerStatus = new FullIndexerStatus(numberIndexWriter);
 		stopIndexing = true;
 		documentQueue = new Vector<Document>();
+		initStatus();
 		resetDocumentCounters();
 	}
 	
+	private void initStatus() {
+		File indexDir = new File(indexPath);
+		if (indexDir.exists()) {
+			final AtomicLong last = new AtomicLong(1);
+			try {
+				Files.walkFileTree(indexDir.toPath(), new SimpleFileVisitor<Path>(){
+					public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+						if(attrs.isRegularFile()) {
+							FileTime time = attrs.lastModifiedTime();
+							long timeInMillis = time.toMillis();
+							if(timeInMillis > 0 && last.longValue() < timeInMillis) {
+								last.set(timeInMillis);
+							}
+						}
+				        return FileVisitResult.CONTINUE;
+					}
+				});
+			} catch (IOException e) {
+				log.error("", e);
+			}
+			fullIndexerStatus.setLastFullIndexTime(last.get());
+		} else {
+			fullIndexerStatus.setLastFullIndexTime(1);
+		}
+	}
+	
 	/**
 	 * Start full indexer thread.
 	 */
@@ -267,7 +303,7 @@ public class OlatFullIndexer {
 	 */
 	public void run() {
 		try {
-		  //TODO: Workround : does not start immediately
+			//TODO: Workround : does not start immediately
 			Thread.sleep(10000);
 
 			log.info("full indexing starts... Lucene-version:" + LucenePackage.get().getImplementationVersion());
@@ -286,7 +322,7 @@ public class OlatFullIndexer {
 			log.info("full indexing summary: started:           "+status.getFullIndexStartedAt());
 			log.info("full indexing summary: counter:           "+status.getDocumentCount());
 			log.info("full indexing summary: index.per.minute:  "+status.getIndexPerMinute());
-			log.info("full indexing summary: finished:          "+status.getLastFullIndexTime());
+			log.info("full indexing summary: finished:          "+status.getLastFullIndexDateString());
 			log.info("full indexing summary: time:              "+status.getIndexingTime()+" ms");
 			log.info("full indexing summary: size:              "+status.getIndexSize());
 			
@@ -446,7 +482,7 @@ public class OlatFullIndexer {
 	}
 	
 	private void resetDocumentCounters() {
-    documentCounters = new Hashtable<String,Integer>();
-    fileTypeCounters = new Hashtable<String,Integer>();		
+		documentCounters = new Hashtable<String,Integer>();
+		fileTypeCounters = new Hashtable<String,Integer>();		
 	}
 }
-- 
GitLab