From cd13d31504432a918c7e9b9597caa0589f2852ca Mon Sep 17 00:00:00 2001 From: Timm Fitschen <t.fitschen@indiscale.com> Date: Tue, 24 Nov 2020 09:13:54 +0100 Subject: [PATCH] WIP: EHN: version history --- .../caosdb/server/database/DatabaseUtils.java | 5 +- .../MySQL/MySQLInsertSparseEntity.java | 2 +- .../MySQL/MySQLRetrieveVersionHistory.java | 4 ++ .../MySQL/MySQLUpdateSparseEntity.java | 2 +- .../transaction/InsertSparseEntity.java | 2 +- .../RetrieveTransactionHistory.java | 72 +++++++++---------- .../transaction/RetrieveVersionHistory.java | 62 ++++++++++++---- .../transaction/RetrieveVersionInfo.java | 48 +++---------- .../backend/transaction/UpdateEntity.java | 1 + .../transaction/UpdateSparseEntity.java | 2 +- .../server/database/proto/SparseEntity.java | 8 +-- .../database/proto/VersionHistoryItem.java | 9 ++- .../java/org/caosdb/server/entity/Entity.java | 7 +- .../org/caosdb/server/entity/Version.java | 48 ++++++++++--- .../entity/xml/VersionXMLSerializer.java | 37 ++++++---- .../org/caosdb/server/jobs/core/History.java | 3 +- .../org/caosdb/server/transaction/Insert.java | 5 -- 17 files changed, 180 insertions(+), 137 deletions(-) diff --git a/src/main/java/org/caosdb/server/database/DatabaseUtils.java b/src/main/java/org/caosdb/server/database/DatabaseUtils.java index d5910eb9..4f6a58a4 100644 --- a/src/main/java/org/caosdb/server/database/DatabaseUtils.java +++ b/src/main/java/org/caosdb/server/database/DatabaseUtils.java @@ -216,10 +216,7 @@ public class DatabaseUtils { ret.fileSize = rs.getLong("FileSize"); ret.fileHash = bytes2UTF8(rs.getBytes("FileHash")); - ret.version = bytes2UTF8(rs.getBytes("Version")); - ret.versionSeconds = rs.getLong("VersionSeconds"); - ret.versionNanos = rs.getInt("VersionNanos"); - + ret.versionId = bytes2UTF8(rs.getBytes("Version")); return ret; } diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertSparseEntity.java index 1f1f32c6..1b945acf 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertSparseEntity.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertSparseEntity.java @@ -57,7 +57,7 @@ public class MySQLInsertSparseEntity extends MySQLTransaction implements InsertS try (final ResultSet rs = insertEntityStmt.executeQuery()) { if (rs.next()) { entity.id = rs.getInt("EntityID"); - entity.version = DatabaseUtils.bytes2UTF8(rs.getBytes("Version")); + entity.versionId = DatabaseUtils.bytes2UTF8(rs.getBytes("Version")); } else { throw new TransactionException("Didn't get new EntityID back."); } diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java index a3c87ae6..7ecfbfb7 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java @@ -61,12 +61,16 @@ public class MySQLRetrieveVersionHistory extends MySQLTransaction String parentId = DatabaseUtils.bytes2UTF8(rs.getBytes("parent")); Long childSeconds = rs.getLong("child_seconds"); Integer childNanos = rs.getInt("child_nanos"); + String childUsername = DatabaseUtils.bytes2UTF8(rs.getBytes("child_username")); + String childRealm = DatabaseUtils.bytes2UTF8(rs.getBytes("child_realm")); VersionHistoryItem v = result.get(childId); if (v == null) { v = new VersionHistoryItem(); v.id = childId; v.seconds = childSeconds; v.nanos = childNanos; + v.username = childUsername; + v.realm = childRealm; result.put(childId, v); } diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java index 18b59ef9..1c803925 100644 --- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java +++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java @@ -80,7 +80,7 @@ public class MySQLUpdateSparseEntity extends MySQLTransaction implements UpdateS ResultSet rs = updateEntityStmt.executeQuery(); if (rs.next()) { - spe.version = DatabaseUtils.bytes2UTF8(rs.getBytes("Version")); + spe.versionId = DatabaseUtils.bytes2UTF8(rs.getBytes("Version")); } } catch (final SQLIntegrityConstraintViolationException e) { 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 1800168e..7e95d1c2 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 @@ -69,6 +69,6 @@ public class InsertSparseEntity extends BackendTransaction { public void cleanUp() {} }); this.entity.setId(e.id); - this.entity.setVersion(new Version(e.version)); + this.entity.setVersion(new Version(e.versionId)); } } 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 632ce20c..d013b296 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 @@ -1,59 +1,59 @@ /* - * ** header v3.0 - * This file is a part of the CaosDB Project. + * ** header v3.0 This file is a part of the CaosDB Project. * - * Copyright (C) 2018 Research Group Biomedical Physics, - * Max-Planck-Institute for Dynamics and Self-Organization Göttingen - * Copyright (C) 2019 IndiScale GmbH - * Copyright (C) 2019 Timm Fitschen (t.fitschen@indiscale.com) + * Copyright (C) 2020 IndiScale GmbH <info@indiscale.com> + * Copyright (C) 2020 Timm Fitschen <t.fitschen@indiscale.com> * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU Affero General Public License as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <https://www.gnu.org/licenses/>. + * You should have received a copy of the GNU Affero General Public License along with this program. + * If not, see <https://www.gnu.org/licenses/>. * * ** end header */ package org.caosdb.server.database.backend.transaction; -import java.util.ArrayList; +import java.util.HashMap; import org.caosdb.datetime.UTCDateTime; -import org.caosdb.server.database.BackendTransaction; -import org.caosdb.server.database.backend.interfaces.RetrieveTransactionHistoryImpl; import org.caosdb.server.database.exceptions.TransactionException; -import org.caosdb.server.database.proto.ProtoTransactionLogMessage; +import org.caosdb.server.database.proto.VersionHistoryItem; import org.caosdb.server.entity.EntityInterface; -import org.caosdb.server.utils.TransactionLogMessage; +import org.caosdb.server.entity.Version; -public class RetrieveTransactionHistory extends BackendTransaction { +public class RetrieveTransactionHistory extends RetrieveVersionHistory { - private final EntityInterface entity; - - public RetrieveTransactionHistory(final EntityInterface entity) { - this.entity = entity; + public RetrieveTransactionHistory(EntityInterface e) { + super(e); } @Override - protected void execute() { - final RetrieveTransactionHistoryImpl t = - getImplementation(RetrieveTransactionHistoryImpl.class); - process(t.execute(entity.getId())); + protected void process(HashMap<String, VersionHistoryItem> map) throws TransactionException { + super.process(map); + if (!map.isEmpty()) getEntity().setVersion(getHistory()); } - private void process(final ArrayList<ProtoTransactionLogMessage> l) throws TransactionException { - for (final ProtoTransactionLogMessage t : l) { - final UTCDateTime dateTime = UTCDateTime.UTCSeconds(t.seconds, t.nanos); - - this.entity.addTransactionLog( - new TransactionLogMessage(t.transaction, this.entity, t.username, dateTime)); + @Override + protected Version getVersion(String id) { + Version v = new Version(id); + VersionHistoryItem i = getHistoryItems().get(v.getId()); + if (i != null) { + v.setDate(UTCDateTime.UTCSeconds(i.seconds, i.nanos)); + v.setUsername(i.username); + v.setRealm(i.realm); } + return v; + } + + private Version getHistory() { + Version v = getVersion(getEntity().getVersion().getId()); + v.setSuccessors(getSuccessors(v.getId(), true)); + v.setPredecessors(getPredecessors(v.getId(), true)); + return v; } } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveVersionHistory.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveVersionHistory.java index 6077d649..53ff3a08 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveVersionHistory.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveVersionHistory.java @@ -22,29 +22,34 @@ */ package org.caosdb.server.database.backend.transaction; -import java.util.Collection; import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import org.apache.commons.jcs.access.behavior.ICacheAccess; +import org.caosdb.server.caching.Cache; import org.caosdb.server.database.CacheableBackendTransaction; import org.caosdb.server.database.backend.interfaces.RetrieveVersionHistoryImpl; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.VersionHistoryItem; import org.caosdb.server.entity.EntityInterface; +import org.caosdb.server.entity.Version; public abstract class RetrieveVersionHistory extends CacheableBackendTransaction<Integer, HashMap<String, VersionHistoryItem>> { - // TODO - // private static final ICacheAccess<String, Version> cache = - // Cache.getCache("BACKEND_RetrieveVersionHistory"); + private static final ICacheAccess<Integer, HashMap<String, VersionHistoryItem>> cache = + Cache.getCache("BACKEND_RetrieveVersionHistory"); private EntityInterface entity; - private HashMap<String, VersionHistoryItem> map; + + /** A map of all history items which belong to this entity. The keys are the version ids. */ + private HashMap<String, VersionHistoryItem> historyItems; public static void removeCached(Integer entityId) { - // TODO + cache.remove(entityId); } public RetrieveVersionHistory(EntityInterface e) { - super(null); // TODO caching + super(cache); this.entity = e; } @@ -57,7 +62,7 @@ public abstract class RetrieveVersionHistory /** After this method call, the version map is available to the object. */ @Override protected void process(HashMap<String, VersionHistoryItem> map) throws TransactionException { - this.map = map; + this.historyItems = map; } @Override @@ -65,15 +70,48 @@ public abstract class RetrieveVersionHistory return entity.getId(); } - public HashMap<String, VersionHistoryItem> getMap() { - return this.map; + public HashMap<String, VersionHistoryItem> getHistoryItems() { + return this.historyItems; } public EntityInterface getEntity() { return this.entity; } - public Collection<VersionHistoryItem> getList() { - return this.map.values(); + /** Return a list of direct predecessors which have their direct predecessors attached */ + protected List<Version> getPredecessors(String id, boolean transitive) { + LinkedList<Version> result = new LinkedList<>(); + if (getHistoryItems().containsKey(id) && getHistoryItems().get(id).parents != null) + for (String p : getHistoryItems().get(id).parents) { + Version predecessor = getVersion(p); + if (transitive) { + predecessor.setPredecessors(getPredecessors(p, transitive)); + } + result.add(predecessor); + } + return result; + } + + protected abstract Version getVersion(String version); + + /** Return a list of direct successors which have their direct successors attached */ + protected List<Version> getSuccessors(String id, boolean transitive) { + LinkedList<Version> result = new LinkedList<>(); + + outer: + for (VersionHistoryItem i : getHistoryItems().values()) { + if (i.parents != null) + for (String p : i.parents) { + if (id.equals(p)) { + Version successor = getVersion(i.id); + result.add(successor); + if (transitive) { + successor.setSuccessors(getSuccessors(i.id, transitive)); + } + continue outer; + } + } + } + return result; } } 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 7d9fe5fd..e2218b1d 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 @@ -23,8 +23,6 @@ package org.caosdb.server.database.backend.transaction; import java.util.HashMap; -import java.util.LinkedList; -import org.caosdb.datetime.UTCDateTime; import org.caosdb.server.database.exceptions.TransactionException; import org.caosdb.server.database.proto.VersionHistoryItem; import org.caosdb.server.entity.EntityInterface; @@ -39,46 +37,18 @@ public class RetrieveVersionInfo extends RetrieveVersionHistory { @Override protected void process(HashMap<String, VersionHistoryItem> map) throws TransactionException { super.process(map); // Make the map available to the object. - if (!map.isEmpty()) getVersion(); + if (!map.isEmpty()) getEntity().setVersion(getVersion()); } - public Version getVersion() { - Version v = getEntity().getVersion(); - VersionHistoryItem i = getMap().get(v.getId()); - if (i != null) v.setDate(UTCDateTime.UTCSeconds(i.seconds, i.nanos)); - - v.setPredecessors(getPredecessors(v.getId())); - v.setSuccessors(getSuccessors(v.getId())); - return v; - } - - /** Return a list of direct children. */ - private LinkedList<Version> getSuccessors(String id) { - LinkedList<Version> result = new LinkedList<>(); - - outer: - for (VersionHistoryItem i : getList()) { - if (i.parents != null) - for (String p : i.parents) { - if (id.equals(p)) { - Version successor = new Version(i.id, i.seconds, i.nanos); - result.add(successor); - continue outer; - } - } - } - return result; + @Override + protected Version getVersion(String id) { + return new Version(id); } - /** Return a list of direct parents. */ - private LinkedList<Version> getPredecessors(String id) { - LinkedList<Version> result = new LinkedList<>(); - if (getMap().containsKey(id) && getMap().get(id).parents != null) - for (String p : getMap().get(id).parents) { - VersionHistoryItem i = getMap().get(p); - Version predecessor = new Version(i.id, i.seconds, i.nanos); - result.add(predecessor); - } - return result; + public Version getVersion() { + Version v = getVersion(getEntity().getVersion().getId()); + v.setPredecessors(getPredecessors(v.getId(), false)); + v.setSuccessors(getSuccessors(v.getId(), false)); + return v; } } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/UpdateEntity.java b/src/main/java/org/caosdb/server/database/backend/transaction/UpdateEntity.java index 9c20cb1d..60fd34c7 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/UpdateEntity.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/UpdateEntity.java @@ -54,6 +54,7 @@ public class UpdateEntity extends BackendTransaction { execute(new InsertEntityProperties(e)); + RetrieveVersionHistory.removeCached(e.getId()); execute(new RetrieveVersionInfo(e)); } } diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/UpdateSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/transaction/UpdateSparseEntity.java index 2385ec84..8548fb04 100644 --- a/src/main/java/org/caosdb/server/database/backend/transaction/UpdateSparseEntity.java +++ b/src/main/java/org/caosdb/server/database/backend/transaction/UpdateSparseEntity.java @@ -52,6 +52,6 @@ public class UpdateSparseEntity extends BackendTransaction { t.execute(spe); - this.entity.setVersion(new Version(spe.version)); + this.entity.setVersion(new Version(spe.versionId)); } } diff --git a/src/main/java/org/caosdb/server/database/proto/SparseEntity.java b/src/main/java/org/caosdb/server/database/proto/SparseEntity.java index 3d5a29c9..d2292c58 100644 --- a/src/main/java/org/caosdb/server/database/proto/SparseEntity.java +++ b/src/main/java/org/caosdb/server/database/proto/SparseEntity.java @@ -38,9 +38,7 @@ public class SparseEntity extends VerySparseEntity { public String filePath = null; public Long fileSize = null; public Long fileChecked = null; - public String version = null; - public Long versionSeconds = null; - public Integer versionNanos = null; + public String versionId = null; @Override public String toString() { @@ -54,9 +52,7 @@ public class SparseEntity extends VerySparseEntity { .append(this.fileHash) .append(this.filePath) .append(this.fileSize) - .append(this.version) - .append(this.versionSeconds) - .append(this.versionNanos) + .append(this.versionId) .toString(); } } diff --git a/src/main/java/org/caosdb/server/database/proto/VersionHistoryItem.java b/src/main/java/org/caosdb/server/database/proto/VersionHistoryItem.java index 26109760..f76b3bc6 100644 --- a/src/main/java/org/caosdb/server/database/proto/VersionHistoryItem.java +++ b/src/main/java/org/caosdb/server/database/proto/VersionHistoryItem.java @@ -5,9 +5,16 @@ import java.util.LinkedList; public class VersionHistoryItem implements Serializable { - private static final long serialVersionUID = 6319362462701459355L; + private static final long serialVersionUID = 428030617967255942L; public String id = null; public LinkedList<String> parents = null; public Long seconds = null; public Integer nanos = null; + public String username = null; + public String realm = null; + + @Override + public String toString() { + return id; + } } diff --git a/src/main/java/org/caosdb/server/entity/Entity.java b/src/main/java/org/caosdb/server/entity/Entity.java index 8578191c..845bb25a 100644 --- a/src/main/java/org/caosdb/server/entity/Entity.java +++ b/src/main/java/org/caosdb/server/entity/Entity.java @@ -34,7 +34,6 @@ import org.apache.shiro.SecurityUtils; import org.apache.shiro.authz.AuthorizationException; import org.apache.shiro.authz.Permission; import org.apache.shiro.subject.Subject; -import org.caosdb.datetime.UTCDateTime; import org.caosdb.server.CaosDBException; import org.caosdb.server.database.proto.SparseEntity; import org.caosdb.server.database.proto.VerySparseEntity; @@ -1079,11 +1078,9 @@ public class Entity extends AbstractObservable implements EntityInterface { setId(spe.id); this.setRole(spe.role); setEntityACL(spe.acl); - UTCDateTime versionDate = null; - if (spe.versionSeconds != null) { - versionDate = UTCDateTime.UTCSeconds(spe.versionSeconds, spe.versionNanos); + if (spe.versionId != null) { + this.version = new Version(spe.versionId); } - this.version = new Version(spe.version, versionDate); if (!isNameOverride()) { setName(spe.name); diff --git a/src/main/java/org/caosdb/server/entity/Version.java b/src/main/java/org/caosdb/server/entity/Version.java index 3f9e1485..693e912e 100644 --- a/src/main/java/org/caosdb/server/entity/Version.java +++ b/src/main/java/org/caosdb/server/entity/Version.java @@ -20,7 +20,7 @@ package org.caosdb.server.entity; -import java.util.LinkedList; +import java.util.List; import org.caosdb.datetime.UTCDateTime; /** @@ -31,25 +31,33 @@ import org.caosdb.datetime.UTCDateTime; public class Version { private String id = null; - private LinkedList<Version> predecessors = null; - private LinkedList<Version> successors = null; + private String username = null; + private String realm = null; + private List<Version> predecessors = null; + private List<Version> successors = null; private UTCDateTime date = null; public Version(String id, long seconds, int nanos) { - this(id, UTCDateTime.UTCSeconds(seconds, nanos)); + this(id, UTCDateTime.UTCSeconds(seconds, nanos), null, null); } - public Version(String id, UTCDateTime date) { + public Version(String id, UTCDateTime date, String username, String realm) { this.id = id; this.date = date; + this.username = username; + this.realm = realm; } public Version(String id) { - this(id, null); + this(id, null, null, null); } public Version() {} + public Version(String id, UTCDateTime timestamp) { + this(id, timestamp, null, null); + } + public UTCDateTime getDate() { return date; } @@ -66,19 +74,39 @@ public class Version { this.id = id; } - public LinkedList<Version> getSuccessors() { + public List<Version> getSuccessors() { return successors; } - public void setSuccessors(LinkedList<Version> successors) { + public void setSuccessors(List<Version> successors) { this.successors = successors; } - public LinkedList<Version> getPredecessors() { + public List<Version> getPredecessors() { return predecessors; } - public void setPredecessors(LinkedList<Version> predecessors) { + public void setPredecessors(List<Version> predecessors) { this.predecessors = predecessors; } + + public String getRealm() { + return realm; + } + + public void setRealm(String realm) { + this.realm = realm; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public void setDate(Long timestamp) { + this.date = UTCDateTime.SystemMillisToUTCDateTime(timestamp); + } } 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 65ec9880..d43fe378 100644 --- a/src/main/java/org/caosdb/server/entity/xml/VersionXMLSerializer.java +++ b/src/main/java/org/caosdb/server/entity/xml/VersionXMLSerializer.java @@ -30,28 +30,37 @@ import org.jdom2.Element; * @author Timm Fitschen <t.fitschen@indiscale.com> */ class VersionXMLSerializer { + public Element toElement(Version version) { - Element result = new Element("Version"); - result.setAttribute("id", version.getId()); - if (version.getDate() != null) { - result.setAttribute("date", version.getDate().toDateTimeString(TimeZone.getDefault())); - } + return toElement(version, "Version"); + } + + private Element toElement(Version version, String tag) { + Element element = new Element(tag); + setAttributes(version, element); if (version.getPredecessors() != null) { for (Version p : version.getPredecessors()) { - Element predecessor = new Element("Predecessor"); - predecessor.setAttribute("id", p.getId()); - predecessor.setAttribute("date", p.getDate().toDateTimeString(TimeZone.getDefault())); - result.addContent(predecessor); + element.addContent(toElement(p, "Predecessor")); } } if (version.getSuccessors() != null) { for (Version s : version.getSuccessors()) { - Element successor = new Element("Successor"); - successor.setAttribute("id", s.getId()); - successor.setAttribute("date", s.getDate().toDateTimeString(TimeZone.getDefault())); - result.addContent(successor); + element.addContent(toElement(s, "Successor")); } } - return result; + return element; + } + + private void setAttributes(Version version, Element element) { + element.setAttribute("id", version.getId()); + if (version.getUsername() != null) { + element.setAttribute("username", version.getUsername()); + } + if (version.getRealm() != null) { + element.setAttribute("realm", version.getRealm()); + } + if (version.getDate() != null) { + element.setAttribute("date", version.getDate().toDateTimeString(TimeZone.getDefault())); + } } } diff --git a/src/main/java/org/caosdb/server/jobs/core/History.java b/src/main/java/org/caosdb/server/jobs/core/History.java index a7c58979..87e9f69d 100644 --- a/src/main/java/org/caosdb/server/jobs/core/History.java +++ b/src/main/java/org/caosdb/server/jobs/core/History.java @@ -24,6 +24,7 @@ package org.caosdb.server.jobs.core; import org.apache.shiro.authz.AuthorizationException; import org.caosdb.server.database.backend.transaction.RetrieveTransactionHistory; +import org.caosdb.server.database.backend.transaction.RetrieveVersionHistory; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.jobs.FlagJob; import org.caosdb.server.jobs.JobAnnotation; @@ -42,7 +43,7 @@ public class History extends FlagJob { if (entity.getId() != null && entity.getId() > 0) { try { entity.checkPermission(EntityPermission.RETRIEVE_HISTORY); - final RetrieveTransactionHistory t = new RetrieveTransactionHistory(entity); + final RetrieveVersionHistory t = new RetrieveTransactionHistory(entity); execute(t); } catch (final AuthorizationException e) { entity.setEntityStatus(EntityStatus.UNQUALIFIED); diff --git a/src/main/java/org/caosdb/server/transaction/Insert.java b/src/main/java/org/caosdb/server/transaction/Insert.java index f60fc128..d37f7ce5 100644 --- a/src/main/java/org/caosdb/server/transaction/Insert.java +++ b/src/main/java/org/caosdb/server/transaction/Insert.java @@ -27,7 +27,6 @@ import org.caosdb.server.database.access.Access; import org.caosdb.server.database.backend.transaction.InsertEntity; import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.FileProperties; -import org.caosdb.server.entity.Version; import org.caosdb.server.entity.container.InsertContainer; import org.caosdb.server.entity.container.TransactionContainer; import org.caosdb.server.permissions.EntityACL; @@ -104,10 +103,6 @@ public class Insert extends WriteTransaction<InsertContainer> { public void insert(final TransactionContainer container, final Access access) throws Exception { if (container.getStatus().ordinal() >= EntityStatus.QUALIFIED.ordinal()) { execute(new InsertEntity(container), access); - for (EntityInterface e : container) { - // TODO move to InsertEntity transaction - e.setVersion(new Version(e.getVersion().getId(), this.getTimestamp())); - } } } -- GitLab