From 209c7c0c8acbe183e3630cd92940f6b5269a16a7 Mon Sep 17 00:00:00 2001
From: Timm Fitschen <t.fitschen@indiscale.com>
Date: Tue, 24 Nov 2020 16:25:54 +0100
Subject: [PATCH] WIP version history

---
 conf/core/cache.ccf                           |  4 ++--
 .../transaction/InsertSparseEntity.java       |  1 +
 .../RetrieveTransactionHistory.java           |  2 ++
 .../transaction/RetrieveVersionInfo.java      |  1 +
 .../org/caosdb/server/entity/Version.java     | 18 +++++++++++++++++
 .../entity/xml/VersionXMLSerializer.java      |  6 ++++++
 .../java/org/caosdb/server/utils/Info.java    | 20 ++++++++++---------
 7 files changed, 41 insertions(+), 11 deletions(-)

diff --git a/conf/core/cache.ccf b/conf/core/cache.ccf
index b4e1f935..ad73cb86 100644
--- a/conf/core/cache.ccf
+++ b/conf/core/cache.ccf
@@ -28,8 +28,8 @@ jcs.region.BACKEND_JobRules.cacheattributes.MaxObjects=103
 jcs.region.BACKEND_SparseEntities
 jcs.region.BACKEND_SparseEntities.cacheattributes.MaxObjects=1002
 
-jcs.region.BACKEND_RetrieveFullVersionInfo
-jcs.region.BACKEND_RetrieveFullVersionInfo.cacheattributes.MaxObjects=1006
+jcs.region.BACKEND_RetrieveVersionHistory
+jcs.region.BACKEND_RetrieveVersionHistory.cacheattributes.MaxObjects=1006
 
 # PAM UserSource Caching: Cached Items expire after 60 seconds if they are not requested (idle) and after 600 seconds max.
 # PAM_UnixUserGroups
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/InsertSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/transaction/InsertSparseEntity.java
index 7e95d1c2..22720f83 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/InsertSparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/InsertSparseEntity.java
@@ -70,5 +70,6 @@ public class InsertSparseEntity extends BackendTransaction {
             });
     this.entity.setId(e.id);
     this.entity.setVersion(new Version(e.versionId));
+    this.entity.getVersion().setHead(true);
   }
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveTransactionHistory.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveTransactionHistory.java
index d013b296..28ffbf8a 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveTransactionHistory.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveTransactionHistory.java
@@ -54,6 +54,8 @@ public class RetrieveTransactionHistory extends RetrieveVersionHistory {
     Version v = getVersion(getEntity().getVersion().getId());
     v.setSuccessors(getSuccessors(v.getId(), true));
     v.setPredecessors(getPredecessors(v.getId(), true));
+    v.setHead(v.getSuccessors().isEmpty());
+    v.setCompleteHistory(true);
     return v;
   }
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveVersionInfo.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveVersionInfo.java
index e2218b1d..26f3f396 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveVersionInfo.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveVersionInfo.java
@@ -49,6 +49,7 @@ public class RetrieveVersionInfo extends RetrieveVersionHistory {
     Version v = getVersion(getEntity().getVersion().getId());
     v.setPredecessors(getPredecessors(v.getId(), false));
     v.setSuccessors(getSuccessors(v.getId(), false));
+    v.setHead(v.getSuccessors().isEmpty());
     return v;
   }
 }
diff --git a/src/main/java/org/caosdb/server/entity/Version.java b/src/main/java/org/caosdb/server/entity/Version.java
index 693e912e..5529c7c5 100644
--- a/src/main/java/org/caosdb/server/entity/Version.java
+++ b/src/main/java/org/caosdb/server/entity/Version.java
@@ -36,6 +36,8 @@ public class Version {
   private List<Version> predecessors = null;
   private List<Version> successors = null;
   private UTCDateTime date = null;
+  private boolean isHead = false;
+  private boolean isCompleteHistory = false;
 
   public Version(String id, long seconds, int nanos) {
     this(id, UTCDateTime.UTCSeconds(seconds, nanos), null, null);
@@ -109,4 +111,20 @@ public class Version {
   public void setDate(Long timestamp) {
     this.date = UTCDateTime.SystemMillisToUTCDateTime(timestamp);
   }
+
+  public boolean isHead() {
+    return isHead;
+  }
+
+  public void setHead(boolean isHead) {
+    this.isHead = isHead;
+  }
+
+  public boolean isCompleteHistory() {
+    return isCompleteHistory;
+  }
+
+  public void setCompleteHistory(boolean isCompleteHistory) {
+    this.isCompleteHistory = isCompleteHistory;
+  }
 }
diff --git a/src/main/java/org/caosdb/server/entity/xml/VersionXMLSerializer.java b/src/main/java/org/caosdb/server/entity/xml/VersionXMLSerializer.java
index d43fe378..40d19a5f 100644
--- a/src/main/java/org/caosdb/server/entity/xml/VersionXMLSerializer.java
+++ b/src/main/java/org/caosdb/server/entity/xml/VersionXMLSerializer.java
@@ -62,5 +62,11 @@ class VersionXMLSerializer {
     if (version.getDate() != null) {
       element.setAttribute("date", version.getDate().toDateTimeString(TimeZone.getDefault()));
     }
+    if (version.isHead()) {
+      element.setAttribute("head", "true");
+    }
+    if (version.isCompleteHistory()) {
+      element.setAttribute("completeHistory", "true");
+    }
   }
 }
diff --git a/src/main/java/org/caosdb/server/utils/Info.java b/src/main/java/org/caosdb/server/utils/Info.java
index 19f792cf..3a488a1c 100644
--- a/src/main/java/org/caosdb/server/utils/Info.java
+++ b/src/main/java/org/caosdb/server/utils/Info.java
@@ -202,6 +202,10 @@ public class Info extends AbstractObservable implements Observer, TransactionInt
     }
     dropOffBox = new File(FileSystem.getDropOffBox());
     final Element info = new Element("Stats");
+    if (CaosDBServer.isDebugMode()) {
+      info.setAttribute("debug", "true");
+    }
+
     final Element counts = new Element("counts");
     counts.setAttribute("records", Integer.toString(recordsCount));
     counts.setAttribute("properties", Integer.toString(propertiesCount));
@@ -209,18 +213,16 @@ public class Info extends AbstractObservable implements Observer, TransactionInt
     counts.setAttribute("files", Integer.toString(filesCount));
     counts.setAttribute("fssize", fssize);
     counts.setAttribute("tmpfiles", Integer.toString(tmpFilesCount));
-    if (CaosDBServer.isDebugMode()) {
-      counts.setAttribute("debug", "true");
-    }
-    final Element e = new Element("dropOffBox");
+
+    final Element dropOffBoxElem = new Element("dropOffBox");
     if (dropOffBox.isDirectory()) {
       if (dropOffBox.canRead()) {
         if (tree) {
-          e.setAttribute("path", dropOffBox.getAbsolutePath());
-          e.addContent(getTree(dropOffBox.listFiles()));
+          dropOffBoxElem.setAttribute("path", dropOffBox.getAbsolutePath());
+          dropOffBoxElem.addContent(getTree(dropOffBox.listFiles()));
         } else {
-          e.setAttribute("path", dropOffBox.getAbsolutePath());
-          e.addContent(getFlatList(dropOffBox.listFiles()));
+          dropOffBoxElem.setAttribute("path", dropOffBox.getAbsolutePath());
+          dropOffBoxElem.addContent(getFlatList(dropOffBox.listFiles()));
         }
       } else {
         // TODO: return a message that the DropOffBox is not readable.
@@ -230,7 +232,7 @@ public class Info extends AbstractObservable implements Observer, TransactionInt
       // present.
     }
     info.addContent(counts);
-    info.addContent(e);
+    info.addContent(dropOffBoxElem);
     return info;
   }
 
-- 
GitLab