From 9c0bfb405132f44b7a9fe670e26f0281852850b2 Mon Sep 17 00:00:00 2001 From: Gavin Date: Wed, 6 Apr 2022 12:52:50 -0700 Subject: [PATCH] Clean up top level provenance class Add a builder, make immutable --- .../performance/GetObjectsLibSpeedTest.java | 5 +- .../refsearch/GetReferencedObjectWithBFS.java | 12 +- .../v0_3_5/GetReferencedObjectWithBFS.java | 19 +- src/us/kbase/common/test/TestCommon.java | 4 + .../kbase/workspace/database/Provenance.java | 70 -- .../database/ResolvedSaveObject.java | 1 + .../kbase/workspace/database/Workspace.java | 3 +- .../database/WorkspaceObjectData.java | 1 + .../database/WorkspaceSaveObject.java | 21 +- .../database/mongo/MongoWorkspaceDB.java | 26 +- .../workspace/database/provenance/Common.java | 4 + .../database/provenance/Provenance.java | 183 +++++ .../database/provenance/ProvenanceAction.java | 21 +- src/us/kbase/workspace/kbase/ArgUtils.java | 36 +- .../kbase/WorkspaceServerMethods.java | 2 +- .../workspace/test/WorkspaceTestCommon.java | 7 + .../database/mongo/MongoInternalsTest.java | 64 +- .../database/mongo/MongoWorkspaceDBTest.java | 28 +- .../test/database/mongo/PartialMock.java | 3 +- .../database/mongo/SchemaUpdaterTest.java | 7 +- .../database/provenance/ProvenanceTest.java | 209 ++++++ .../test/workspace/ProvenanceTest.java | 40 -- .../WorkspaceIntegrationWithGridFSTest.java | 5 +- .../test/workspace/WorkspaceListenerTest.java | 18 +- .../test/workspace/WorkspaceLongTest.java | 18 +- .../workspace/WorkspaceObjectDataTest.java | 6 +- .../test/workspace/WorkspaceTest.java | 667 ++++++++++-------- .../test/workspace/WorkspaceTester.java | 6 +- .../test/workspace/WorkspaceUnitTest.java | 9 +- 29 files changed, 945 insertions(+), 550 deletions(-) delete mode 100644 src/us/kbase/workspace/database/Provenance.java create mode 100644 src/us/kbase/workspace/database/provenance/Provenance.java create mode 100644 src/us/kbase/workspace/test/database/provenance/ProvenanceTest.java delete mode 100644 src/us/kbase/workspace/test/workspace/ProvenanceTest.java diff --git a/performanceanddevelopment/legacy/performance/GetObjectsLibSpeedTest.java b/performanceanddevelopment/legacy/performance/GetObjectsLibSpeedTest.java index 61d815149..f676f8d04 100644 --- a/performanceanddevelopment/legacy/performance/GetObjectsLibSpeedTest.java +++ b/performanceanddevelopment/legacy/performance/GetObjectsLibSpeedTest.java @@ -1,5 +1,7 @@ package legacy.performance; +import static us.kbase.workspace.test.WorkspaceTestCommon.basicProv; + import java.io.ByteArrayOutputStream; import java.io.File; import java.io.OutputStreamWriter; @@ -36,7 +38,6 @@ import us.kbase.workspace.database.ByteArrayFileCacheManager.ByteArrayFileCache; import us.kbase.workspace.database.ObjectIDNoWSNoVer; import us.kbase.workspace.database.ObjectIdentifier; -import us.kbase.workspace.database.Provenance; import us.kbase.workspace.database.ResourceUsageConfigurationBuilder; import us.kbase.workspace.database.Types; import us.kbase.workspace.database.Workspace; @@ -106,7 +107,7 @@ public static void main(String[] args) throws Exception { new WorkspaceSaveObject(//added obj name when autonaming removed new ObjectIDNoWSNoVer(UUID.randomUUID().toString() .replace("-", "")), - o, td, null, new Provenance(user), false)), fac); + o, td, null, basicProv(user), false)), fac); o = null; ObjectIdentifier oi = ObjectIdentifier.getBuilder(wsi).withName("auto1").build(); diff --git a/performanceanddevelopment/legacy/performance/us/kbase/workspace/performance/refsearch/GetReferencedObjectWithBFS.java b/performanceanddevelopment/legacy/performance/us/kbase/workspace/performance/refsearch/GetReferencedObjectWithBFS.java index 8948ea907..26fc41136 100644 --- a/performanceanddevelopment/legacy/performance/us/kbase/workspace/performance/refsearch/GetReferencedObjectWithBFS.java +++ b/performanceanddevelopment/legacy/performance/us/kbase/workspace/performance/refsearch/GetReferencedObjectWithBFS.java @@ -1,5 +1,7 @@ package legacy.performance.us.kbase.workspace.performance.refsearch; +import static us.kbase.workspace.test.WorkspaceTestCommon.basicProv; + import java.io.File; import java.nio.file.Paths; import java.util.Arrays; @@ -26,7 +28,6 @@ import us.kbase.workspace.database.ObjectIDNoWSNoVer; import us.kbase.workspace.database.ObjectIdentifier; import us.kbase.workspace.database.ObjectInformation; -import us.kbase.workspace.database.Provenance; import us.kbase.workspace.database.ResourceUsageConfigurationBuilder; import us.kbase.workspace.database.Types; import us.kbase.workspace.database.Workspace; @@ -35,6 +36,7 @@ import us.kbase.workspace.database.WorkspaceUser; import us.kbase.workspace.database.mongo.GridFSBlobStore; import us.kbase.workspace.database.mongo.MongoWorkspaceDB; +import us.kbase.workspace.database.provenance.Provenance; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; @@ -147,7 +149,7 @@ private static void runBranchedReferencesTest() throws Exception { WorkspaceUser u2 = new WorkspaceUser("brcu2"); final IdReferenceHandlerSetFactory fac = IdReferenceHandlerSetFactoryBuilder .getBuilder(10).build().getFactory(null); - Provenance p = new Provenance(u1); + final Provenance p = basicProv(u1); WorkspaceIdentifier read = new WorkspaceIdentifier("brcread"); WorkspaceIdentifier priv = new WorkspaceIdentifier("brcpriv"); for (int breadth = 1; breadth <= MAX_TREE_BREADTH; breadth++) { @@ -184,7 +186,7 @@ private static List generateReferences( throws Exception { final IdReferenceHandlerSetFactory fac = IdReferenceHandlerSetFactoryBuilder .getBuilder(100000).build().getFactory(null); - Provenance p = new Provenance(user); + final Provenance p = basicProv(user); List objs = new LinkedList(); for (ObjectInformation oi: increfs) { String ref = oi.getWorkspaceId() + "/" + oi.getObjectId() + "/" + oi.getVersion(); @@ -217,7 +219,7 @@ private static void runLinearReferencesTest() throws Exception { final IdReferenceHandlerSetFactory fac = IdReferenceHandlerSetFactoryBuilder .getBuilder(10000).build().getFactory(null); - Provenance p = new Provenance(u1); + final Provenance p = basicProv(u1); ObjectInformation o = WS.saveObjects(u1, priv, Arrays.asList( new WorkspaceSaveObject(getRandomName(), new HashMap(), LEAF_TYPE, null, p, false)), fac).get(0); @@ -250,7 +252,7 @@ private static ObjectInformation saveRefData( refdata.put("refs", Arrays.asList(ref)); final IdReferenceHandlerSetFactory fac = IdReferenceHandlerSetFactoryBuilder .getBuilder(10000).build().getFactory(null); - Provenance p = new Provenance(u1); + final Provenance p = basicProv(u1); return WS.saveObjects(u1, priv, Arrays.asList( new WorkspaceSaveObject(getRandomName(), refdata, REF_TYPE, null, p, false)), fac) .get(0); diff --git a/performanceanddevelopment/legacy/performance/us/kbase/workspace/performance/refsearch/v0_3_5/GetReferencedObjectWithBFS.java b/performanceanddevelopment/legacy/performance/us/kbase/workspace/performance/refsearch/v0_3_5/GetReferencedObjectWithBFS.java index e2cbfe755..ed92e8831 100644 --- a/performanceanddevelopment/legacy/performance/us/kbase/workspace/performance/refsearch/v0_3_5/GetReferencedObjectWithBFS.java +++ b/performanceanddevelopment/legacy/performance/us/kbase/workspace/performance/refsearch/v0_3_5/GetReferencedObjectWithBFS.java @@ -1,5 +1,7 @@ package legacy.performance.us.kbase.workspace.performance.refsearch.v0_3_5; // note package changed from orig +import static us.kbase.workspace.test.WorkspaceTestCommon.basicProv; + import java.io.File; import java.nio.file.Paths; import java.util.Arrays; @@ -17,23 +19,16 @@ import us.kbase.typedobj.core.AbsoluteTypeDefId; import us.kbase.typedobj.core.TempFilesManager; import us.kbase.typedobj.core.TypeDefName; -//import us.kbase.typedobj.core.TypedObjectValidator; -//import us.kbase.typedobj.db.MongoTypeStorage; -//import us.kbase.typedobj.db.TypeDefinitionDB; import us.kbase.typedobj.idref.IdReferenceHandlerSetFactory; import us.kbase.typedobj.idref.IdReferenceHandlerSetFactoryBuilder; -//import us.kbase.workspace.database.DefaultReferenceParser; import us.kbase.workspace.database.ObjectIDNoWSNoVer; import us.kbase.workspace.database.ObjectIdentifier; import us.kbase.workspace.database.ObjectInformation; -import us.kbase.workspace.database.Provenance; -//import us.kbase.workspace.database.ResourceUsageConfigurationBuilder; import us.kbase.workspace.database.Workspace; import us.kbase.workspace.database.WorkspaceIdentifier; import us.kbase.workspace.database.WorkspaceSaveObject; import us.kbase.workspace.database.WorkspaceUser; -//import us.kbase.workspace.database.mongo.GridFSBlobStore; -//import us.kbase.workspace.database.mongo.MongoWorkspaceDB; +import us.kbase.workspace.database.provenance.Provenance; import ch.qos.logback.classic.Level; import ch.qos.logback.classic.Logger; @@ -155,7 +150,7 @@ private static void runBranchedReferencesTest() throws Exception { WorkspaceUser u2 = new WorkspaceUser("brcu2"); final IdReferenceHandlerSetFactory fac = IdReferenceHandlerSetFactoryBuilder .getBuilder(10).build().getFactory(null); - Provenance p = new Provenance(u1); + final Provenance p = basicProv(u1); WorkspaceIdentifier read = new WorkspaceIdentifier("brcread"); WorkspaceIdentifier priv = new WorkspaceIdentifier("brcpriv"); for (int breadth = 1; breadth <= 10; breadth++) { @@ -194,7 +189,7 @@ private static List generateReferences( throws Exception { final IdReferenceHandlerSetFactory fac = IdReferenceHandlerSetFactoryBuilder .getBuilder(100000).build().getFactory(null); - Provenance p = new Provenance(user); + final Provenance p = basicProv(user); List objs = new LinkedList(); for (ObjectInformation oi: increfs) { String ref = oi.getWorkspaceId() + "/" + oi.getObjectId() + "/" + oi.getVersion(); @@ -228,7 +223,7 @@ private static void runLinearReferencesTest() throws Exception { final IdReferenceHandlerSetFactory fac = IdReferenceHandlerSetFactoryBuilder .getBuilder(10000).build().getFactory(null); - Provenance p = new Provenance(u1); + final Provenance p = basicProv(u1); ObjectInformation o = WS.saveObjects(u1, priv, Arrays.asList( new WorkspaceSaveObject(getRandomName(), new HashMap(), LEAF_TYPE, null, p, false)), fac).get(0); @@ -261,7 +256,7 @@ private static ObjectInformation saveRefData( refdata.put("refs", Arrays.asList(ref)); final IdReferenceHandlerSetFactory fac = IdReferenceHandlerSetFactoryBuilder .getBuilder(10000).build().getFactory(null); - Provenance p = new Provenance(u1); + final Provenance p = basicProv(u1); return WS.saveObjects(u1, priv, Arrays.asList( new WorkspaceSaveObject(getRandomName(), refdata, REF_TYPE, null, p, false)), fac) .get(0); diff --git a/src/us/kbase/common/test/TestCommon.java b/src/us/kbase/common/test/TestCommon.java index 5528e477d..642e2e8cc 100644 --- a/src/us/kbase/common/test/TestCommon.java +++ b/src/us/kbase/common/test/TestCommon.java @@ -283,6 +283,10 @@ public static Instant inst(final long epoch) { return Instant.ofEpochMilli(epoch); } + public static Instant now() { + return Instant.now(); + } + public static final Optional ES = Optional.empty(); public static final Optional EL = Optional.empty(); public static final Optional EI = Optional.empty(); diff --git a/src/us/kbase/workspace/database/Provenance.java b/src/us/kbase/workspace/database/Provenance.java deleted file mode 100644 index e8a2916a4..000000000 --- a/src/us/kbase/workspace/database/Provenance.java +++ /dev/null @@ -1,70 +0,0 @@ -package us.kbase.workspace.database; - -import static java.util.Objects.requireNonNull; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import us.kbase.workspace.database.provenance.ProvenanceAction; - -//TODO TEST unit tests -//TODO JAVADOC -//TODO MEM this should keep track of its size & punt if it gets too large -//TODO CODE make this immutable and use builders. -//TODO CODE don't allow nulls for lists/maps -//TODO CODE this whole class needs a massive refactor - -public class Provenance { - - private final WorkspaceUser user; - private final Date date; - private Long wsid = null; - protected List actions = - new ArrayList(); - - public Provenance(final WorkspaceUser user) { - requireNonNull(user, "user"); - this.user = user; - this.date = new Date(); - } - - public Provenance(final WorkspaceUser user, final Date date) { - requireNonNull(user, "user"); - this.user = user; - this.date = date; - } - - public Provenance addAction(ProvenanceAction action) { - if (action == null) { - throw new IllegalArgumentException("action cannot be null"); - } - actions.add(action); - return this; - } - - public WorkspaceUser getUser() { - return user; - } - - public Date getDate() { - return date; - } - - public void setWorkspaceID(final Long wsid) { - // objects saved before version 0.4.1 will have null workspace IDs - if (wsid != null && wsid < 1) { - throw new IllegalArgumentException("wsid must be > 0"); - } - this.wsid = wsid; - } - // will be null if not set yet - public Long getWorkspaceID() { - return wsid; - } - - public List getActions() { - return new ArrayList(actions); - } - -} diff --git a/src/us/kbase/workspace/database/ResolvedSaveObject.java b/src/us/kbase/workspace/database/ResolvedSaveObject.java index 7ffe057ed..9692680f2 100644 --- a/src/us/kbase/workspace/database/ResolvedSaveObject.java +++ b/src/us/kbase/workspace/database/ResolvedSaveObject.java @@ -8,6 +8,7 @@ import us.kbase.typedobj.idref.IdReferenceType; import us.kbase.typedobj.idref.RemappedId; import us.kbase.workspace.database.WorkspaceUserMetadata.MetadataException; +import us.kbase.workspace.database.provenance.Provenance; public class ResolvedSaveObject { diff --git a/src/us/kbase/workspace/database/Workspace.java b/src/us/kbase/workspace/database/Workspace.java index 72a8ffae6..d9045d246 100644 --- a/src/us/kbase/workspace/database/Workspace.java +++ b/src/us/kbase/workspace/database/Workspace.java @@ -725,7 +725,6 @@ public List saveObjects( int objcount = 1; for (WorkspaceSaveObject wo: objects) { //maintain ordering - wo.getProvenance().setWorkspaceID(Long.valueOf(rwsi.getID())); final List provrefs = new LinkedList(); for (final ProvenanceAction action: wo.getProvenance().getActions()) { for (final String ref: action.getWorkspaceObjects()) { @@ -751,7 +750,7 @@ public List saveObjects( } final ValidatedTypedObject rep = reports.get(wo); - saveobjs.add(wo.resolve(rep, refs, provrefs, extractedIDs)); + saveobjs.add(wo.resolve(rwsi, rep, refs, provrefs, extractedIDs)); ttlObjSize += rep.calculateRelabeledSize(); if (rep.getRelabeledSize() > rescfg.getMaxObjectSize()) { throw new IllegalArgumentException(String.format( diff --git a/src/us/kbase/workspace/database/WorkspaceObjectData.java b/src/us/kbase/workspace/database/WorkspaceObjectData.java index a89df2d73..b64bca625 100644 --- a/src/us/kbase/workspace/database/WorkspaceObjectData.java +++ b/src/us/kbase/workspace/database/WorkspaceObjectData.java @@ -13,6 +13,7 @@ import us.kbase.typedobj.core.SubsetSelection; import us.kbase.typedobj.idref.IdReferenceType; import us.kbase.workspace.database.ByteArrayFileCacheManager.ByteArrayFileCache; +import us.kbase.workspace.database.provenance.Provenance; /** A package containing (optionally) a workspace object's data along with provenance and * information about the object. diff --git a/src/us/kbase/workspace/database/WorkspaceSaveObject.java b/src/us/kbase/workspace/database/WorkspaceSaveObject.java index c8c62ffa9..d972c8c41 100644 --- a/src/us/kbase/workspace/database/WorkspaceSaveObject.java +++ b/src/us/kbase/workspace/database/WorkspaceSaveObject.java @@ -9,9 +9,17 @@ import us.kbase.typedobj.core.ValidatedTypedObject; import us.kbase.typedobj.idref.IdReferenceType; import us.kbase.typedobj.idref.RemappedId; +import us.kbase.workspace.database.provenance.Provenance; public class WorkspaceSaveObject { + // TODO TEST unit tests + // TODO JAVADOC + + // Unfortunately UObjects aren't necessarily immutable so there's no way to make this truly + // immutable - although maybe could check that the UObject wraps a JsonTokenStream in which + // case it should be immutable (double check) + private final ObjectIDNoWSNoVer id; private final UObject data; private final TypeDefId type; @@ -69,13 +77,20 @@ public boolean isHidden() { // provrefs *must* be in the same ordering as they are in the provenance actions public ResolvedSaveObject resolve( + final ResolvedWorkspaceID wsid, final ValidatedTypedObject rep, final Set references, final List provenancerefs, final Map> extractedIDs) { - return new ResolvedSaveObject(this.id, this.userMeta, - this.provenance, this.hidden, rep, references, - provenancerefs, extractedIDs); + return new ResolvedSaveObject( + this.id, + this.userMeta, + this.provenance.updateWorkspaceID(wsid.getID()), + this.hidden, + rep, + references, + provenancerefs, + extractedIDs); } @Override diff --git a/src/us/kbase/workspace/database/mongo/MongoWorkspaceDB.java b/src/us/kbase/workspace/database/mongo/MongoWorkspaceDB.java index 040b3b42c..32808d4ac 100644 --- a/src/us/kbase/workspace/database/mongo/MongoWorkspaceDB.java +++ b/src/us/kbase/workspace/database/mongo/MongoWorkspaceDB.java @@ -72,7 +72,7 @@ import us.kbase.workspace.database.Permission; import us.kbase.workspace.database.PermissionSet; import us.kbase.workspace.database.PermissionSet.Builder; -import us.kbase.workspace.database.Provenance; +import us.kbase.workspace.database.provenance.Provenance; import us.kbase.workspace.database.Reference; import us.kbase.workspace.database.ResolvedObjectID; import us.kbase.workspace.database.ResolvedObjectIDNoVer; @@ -2013,8 +2013,14 @@ private Map emptyToNull(final Map map) { private Map toDocument(final Provenance p) { final Map ret = new HashMap<>(); ret.put(Fields.PROV_USER, p.getUser().getUser()); - ret.put(Fields.PROV_DATE, p.getDate()); - ret.put(Fields.PROV_WS_ID, p.getWorkspaceID()); + // this is a bit of a hack, but the JSON representation of an Instant is ~30 chars bigger + // than a Date and not always the same length, which screws with the size calculations in + // tests when writing this map to JSON (which is also a bit of a hack, but doesn't need to + // be byte level accurate). Both instants and dates are accepted by Mongo so just use a + // Date here. + // Might make more sense to write BSON vs. JSON for the size calcs. + ret.put(Fields.PROV_DATE, Date.from(p.getDate())); + ret.put(Fields.PROV_WS_ID, p.getWorkspaceID().orElse(null)); final List> actions = new LinkedList<>(); ret.put(Fields.PROV_ACTIONS, actions); for (final ProvenanceAction pa: p.getActions()) { @@ -2032,7 +2038,7 @@ private Map toDocument(final Provenance p) { paret.put(Fields.PROV_ACTION_SCRIPT_VER, pa.getScriptVersion().orElse(null)); paret.put(Fields.PROV_ACTION_SERVICE, pa.getServiceName().orElse(null)); paret.put(Fields.PROV_ACTION_SERVICE_VER, pa.getServiceVersion().orElse(null)); - paret.put(Fields.PROV_ACTION_TIME, pa.getTime().orElse(null)); + paret.put(Fields.PROV_ACTION_TIME, pa.getTime().map(t -> Date.from(t)).orElse(null)); paret.put(Fields.PROV_ACTION_WS_OBJS, emptyToNull(pa.getWorkspaceObjects())); final List> extdata = new LinkedList<>(); @@ -2745,11 +2751,11 @@ private Provenance toProvenance( final List resolvedRefs) { // make a copy we can mutate final List rrcopy = new LinkedList<>(resolvedRefs); - final Provenance ret = new Provenance( + final Provenance.Builder ret = Provenance.getBuilder( new WorkspaceUser(p.getString(Fields.PROV_USER)), - p.getDate(Fields.PROV_DATE)); - // objects saved before version 0.4.1 will have null workspace IDs - ret.setWorkspaceID(p.getLong(Fields.PROV_WS_ID)); + p.getDate(Fields.PROV_DATE).toInstant()) + // objects saved before version 0.4.1 will have null workspace IDs + .withWorkspaceID(p.getLong(Fields.PROV_WS_ID)); for (final Document pa: p.getList(Fields.PROV_ACTIONS, Document.class)) { @SuppressWarnings("unchecked") final Map precustom = @@ -2764,7 +2770,7 @@ private Provenance toProvenance( final List actionRefs = new LinkedList<>(rrcopy.subList(0, refcnt)); rrcopy.subList(0, refcnt).clear(); - ret.addAction(ProvenanceAction.getBuilder() + ret.withAction(ProvenanceAction.getBuilder() .withExternalData(toExternalData(pa.getList( Fields.PROV_ACTION_EXTERNAL_DATA, Document.class))) .withSubActions(toSubAction(pa.getList( @@ -2787,7 +2793,7 @@ private Provenance toProvenance( .build() ); } - return ret; + return ret.build(); } private List getParamList(final Document provaction) { diff --git a/src/us/kbase/workspace/database/provenance/Common.java b/src/us/kbase/workspace/database/provenance/Common.java index 514773b59..65256363a 100644 --- a/src/us/kbase/workspace/database/provenance/Common.java +++ b/src/us/kbase/workspace/database/provenance/Common.java @@ -78,4 +78,8 @@ static List immutable(final List list) { */ return Collections.unmodifiableList(new ArrayList<>(list)); } + + static List getList(final List list) { + return list == null ? Collections.emptyList() : list; + } } diff --git a/src/us/kbase/workspace/database/provenance/Provenance.java b/src/us/kbase/workspace/database/provenance/Provenance.java new file mode 100644 index 000000000..0e3dfecd4 --- /dev/null +++ b/src/us/kbase/workspace/database/provenance/Provenance.java @@ -0,0 +1,183 @@ +package us.kbase.workspace.database.provenance; + +import static java.util.Objects.requireNonNull; + +import java.time.Instant; +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; + +import us.kbase.workspace.database.WorkspaceUser; + +/** Provenance for a data object that describes how that data object was created. */ +public class Provenance { + + private final List actions; + private final WorkspaceUser user; + private final Instant date; + private final long wsid; + + private Provenance( + final WorkspaceUser user, + final Instant date, + final long wsid, + final List actions) { + this.actions = actions; + this.user = user; + this.date = date; + this.wsid = wsid; + } + + /** Get the user that created the data. + * @return the user. + */ + public WorkspaceUser getUser() { + return user; + } + + /** Get the time the data was saved to the workspace. + * @return the time. + */ + public Instant getDate() { + return date; + } + + /** Get the original workspace in which the data was saved. + * Data saved before version 0.4.1 of the workspace never have this field. + * @return the original workspace ID, if present. + */ + public Optional getWorkspaceID() { + return wsid < 1 ? Optional.empty() : Optional.ofNullable(wsid); + } + + /** Get the actions that took place while creating the data object. + * @return the actions. + */ + public List getActions() { + return Common.getList(actions); + } + + /** Update the workspace ID for the provenance. This returns this provenance instance if + * the workspace ID doesn't change, or a new provenance instance if the incoming workspace + * ID is different. + * @param workspaceID the new workspace ID. + * @return this or a new Provenance. + */ + public Provenance updateWorkspaceID(final Long workspaceID) { + if (workspaceID == null) { + if (wsid == -1) { + return this; + } + return new Provenance(user, date, -1, actions); + } + if (workspaceID < 1) { + throw new IllegalArgumentException("workspace ID must be > 0"); + } + if (wsid == workspaceID) { + return this; + } + return new Provenance(user, date, workspaceID, actions); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((actions == null) ? 0 : actions.hashCode()); + result = prime * result + ((date == null) ? 0 : date.hashCode()); + result = prime * result + ((user == null) ? 0 : user.hashCode()); + result = prime * result + (int) (wsid ^ (wsid >>> 32)); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Provenance other = (Provenance) obj; + if (actions == null) { + if (other.actions != null) + return false; + } else if (!actions.equals(other.actions)) + return false; + if (date == null) { + if (other.date != null) + return false; + } else if (!date.equals(other.date)) + return false; + if (user == null) { + if (other.user != null) + return false; + } else if (!user.equals(other.user)) + return false; + if (wsid != other.wsid) + return false; + return true; + } + + /** Get a builder for a {@link Provenance}. + * @param user the user that created the data that is the subject of this provenance. + * @param date the date the data was saved to the workspace. + * @return the builder. + */ + public static Builder getBuilder(final WorkspaceUser user, final Instant date) { + return new Builder(user, date); + } + + /** A builder for a {@link Provenance}. */ + public static class Builder { + + private final WorkspaceUser user; + private final Instant date; + private long wsid = -1; + private List actions = null; + + private Builder(final WorkspaceUser user, final Instant date) { + this.user = requireNonNull(user, "user"); + this.date = requireNonNull(date, "date"); + } + + /** Set the ID of the workspace in which the data was originally saved. Passing null + * removes any ID in the builder. + * @param workspaceID the workspace ID. + * @return this buider. + */ + public Builder withWorkspaceID(final Long workspaceID) { + if (workspaceID == null) { + this.wsid = -1; + } else if (workspaceID < 1) { + throw new IllegalArgumentException("workspace ID must be > 0"); + } else { + this.wsid = workspaceID; + } + return this; + } + + /** Add an action to the provenance. + * @param action a provenance action. + * @return this builder. + */ + public Builder withAction(final ProvenanceAction action) { + // could check if the output args from the prior PA in the list match the input + // args to this PA, but no one uses this feature AFAIK so not worth it + requireNonNull(action, "action"); + if (actions == null) { + actions = new LinkedList<>(); + } + actions.add(action); + return this; + } + + /** Build the {@link Provenance}. + * @return the provenance. + */ + public Provenance build() { + return new Provenance( + user, date, wsid, actions == null ? null : Common.immutable(actions)); + } + } +} diff --git a/src/us/kbase/workspace/database/provenance/ProvenanceAction.java b/src/us/kbase/workspace/database/provenance/ProvenanceAction.java index 4fe4ad7ff..08e5efc35 100644 --- a/src/us/kbase/workspace/database/provenance/ProvenanceAction.java +++ b/src/us/kbase/workspace/database/provenance/ProvenanceAction.java @@ -65,9 +65,6 @@ public class ProvenanceAction { private final String scriptVersion; private final String commandLine; private final List wsobjs; - // there could be some checking between PAs in series to see if their in args are - // a subset of the out args of the previous PA, but I don't think this feature is actually - // used, so don't bother for now, and it would need to happen outside this class anyway. private final List incomingArgs; private final List outgoingArgs; private final List externalData; @@ -156,7 +153,7 @@ public Optional getMethod() { * @return the method parameters. */ public List getMethodParameters() { - return getList(methodParameters); + return Common.getList(methodParameters); } /** Get the name of the script that performed the action described in this @@ -189,7 +186,7 @@ public Optional getCommandLine() { * @return the workspace objects. */ public List getWorkspaceObjects() { - return getList(wsobjs); + return Common.getList(wsobjs); } /** Get the incoming arguments to this provenance action from the prior provenance action. @@ -199,7 +196,7 @@ public List getWorkspaceObjects() { * @return the incoming arguments. */ public List getIncomingArgs() { - return getList(incomingArgs); + return Common.getList(incomingArgs); } /** Get the outgoing arguments from this provenance action to the next provenance action. @@ -210,21 +207,21 @@ public List getIncomingArgs() { * @return the outgoing arguments. */ public List getOutgoingArgs() { - return getList(outgoingArgs); + return Common.getList(outgoingArgs); } /** Get information about any external data used in this provenance action. * @return the external data. */ public List getExternalData() { - return getList(externalData); + return Common.getList(externalData); } /** Get information about any sub actions taken as part of this provenance action. * @return the sub actions. */ public List getSubActions() { - return getList(subActions); + return Common.getList(subActions); } /** Get any custom provenance information for this action. @@ -248,13 +245,9 @@ public Optional getDescription() { * present. */ public List getResolvedObjects() { - return getList(resolvedObjects); + return Common.getList(resolvedObjects); } - private List getList(final List list) { - return list == null ? Collections.emptyList() : list; - } - @Override public int hashCode() { final int prime = 31; diff --git a/src/us/kbase/workspace/kbase/ArgUtils.java b/src/us/kbase/workspace/kbase/ArgUtils.java index bbf36f5dc..2ae80c2ab 100644 --- a/src/us/kbase/workspace/kbase/ArgUtils.java +++ b/src/us/kbase/workspace/kbase/ArgUtils.java @@ -42,12 +42,12 @@ import us.kbase.workspace.ObjectData; import us.kbase.workspace.database.ObjectInformation; import us.kbase.workspace.database.Permission; -import us.kbase.workspace.database.Provenance; import us.kbase.workspace.database.Reference; import us.kbase.workspace.database.WorkspaceInformation; import us.kbase.workspace.database.WorkspaceObjectData; import us.kbase.workspace.database.WorkspaceUser; import us.kbase.workspace.database.provenance.ExternalData; +import us.kbase.workspace.database.provenance.Provenance; import us.kbase.workspace.database.provenance.ProvenanceAction; import us.kbase.workspace.database.provenance.SubAction; @@ -106,9 +106,9 @@ public static Provenance processProvenance( final List actions) throws ParseException { - final Provenance p = new Provenance(user); + final Provenance.Builder p = Provenance.getBuilder(user, Instant.now()); if (actions == null) { - return p; + return p.build(); } for (final us.kbase.workspace.ProvenanceAction a: actions) { // TODO PROV what if a is null? @@ -116,7 +116,7 @@ public static Provenance processProvenance( final Instant d = chooseInstant(a.getTime(), a.getEpoch(), "Cannot specify both time and epoch in provenance " + "action"); - p.addAction(ProvenanceAction.getBuilder() + p.withAction(ProvenanceAction.getBuilder() .withTime(d) .withCaller(a.getCaller()) .withServiceName(a.getService()) @@ -137,7 +137,7 @@ public static Provenance processProvenance( .build() ); } - return p; + return p.build(); } private static List processSubActions( @@ -425,18 +425,15 @@ public static List translateObjectData( .withData(data) .withInfo(objInfoToTuple(o.getObjectInfo(), logObjects)) .withPath(toObjectPath(o.getObjectInfo().getReferencePath())) - .withProvenance(translateProvenanceActions( - o.getProvenance().getActions())) + .withProvenance(translateProvenanceActions(o.getProvenance().getActions())) .withCreator(o.getProvenance().getUser().getUser()) - .withOrigWsid(o.getProvenance().getWorkspaceID()) - .withCreated(formatDate( - o.getProvenance().getDate())) - .withEpoch(o.getProvenance().getDate().getTime()) + .withOrigWsid(o.getProvenance().getWorkspaceID().orElse(null)) + .withCreated(formatDate(o.getProvenance().getDate())) + .withEpoch(o.getProvenance().getDate().toEpochMilli()) .withRefs(o.getReferences()) .withCopied(o.getCopyReference().isPresent() ? o.getCopyReference().get().getId() : null) - .withCopySourceInaccessible( - o.isCopySourceInaccessible() ? 1L: 0L) + .withCopySourceInaccessible(o.isCopySourceInaccessible() ? 1L: 0L) .withExtractedIds(toRawExternalIDs(o.getExtractedIds())) .withHandleError(errs.get(o).error) .withHandleStacktrace(errs.get(o).stackTrace)); @@ -483,18 +480,15 @@ public static List translateObjectProvI Arrays.asList(o), Optional.of(permHandler)).get(o); ret.add(new us.kbase.workspace.ObjectProvenanceInfo() .withInfo(objInfoToTuple(o.getObjectInfo(), logObjects)) - .withProvenance(translateProvenanceActions( - o.getProvenance().getActions())) + .withProvenance(translateProvenanceActions(o.getProvenance().getActions())) .withCreator(o.getProvenance().getUser().getUser()) - .withOrigWsid(o.getProvenance().getWorkspaceID()) - .withCreated(formatDate( - o.getProvenance().getDate())) - .withEpoch(o.getProvenance().getDate().getTime()) + .withOrigWsid(o.getProvenance().getWorkspaceID().orElse(null)) + .withCreated(formatDate(o.getProvenance().getDate())) + .withEpoch(o.getProvenance().getDate().toEpochMilli()) .withRefs(o.getReferences()) .withCopied(o.getCopyReference().isPresent() ? o.getCopyReference().get().getId() : null) - .withCopySourceInaccessible( - o.isCopySourceInaccessible() ? 1L: 0L) + .withCopySourceInaccessible(o.isCopySourceInaccessible() ? 1L: 0L) .withExtractedIds(toRawExternalIDs(o.getExtractedIds())) .withHandleError(error.error) .withHandleStacktrace(error.stackTrace)); diff --git a/src/us/kbase/workspace/kbase/WorkspaceServerMethods.java b/src/us/kbase/workspace/kbase/WorkspaceServerMethods.java index 8dd627213..676f969ba 100644 --- a/src/us/kbase/workspace/kbase/WorkspaceServerMethods.java +++ b/src/us/kbase/workspace/kbase/WorkspaceServerMethods.java @@ -67,7 +67,6 @@ import us.kbase.workspace.database.ObjectIdentifier; import us.kbase.workspace.database.ObjectInformation; import us.kbase.workspace.database.Permission; -import us.kbase.workspace.database.Provenance; import us.kbase.workspace.database.RefLimit; import us.kbase.workspace.database.Types; import us.kbase.workspace.database.User; @@ -87,6 +86,7 @@ import us.kbase.workspace.database.exceptions.NoSuchWorkspaceException; import us.kbase.workspace.database.exceptions.PreExistingWorkspaceException; import us.kbase.workspace.database.exceptions.WorkspaceCommunicationException; +import us.kbase.workspace.database.provenance.Provenance; import us.kbase.workspace.database.refsearch.ReferenceSearchMaximumSizeExceededException; import us.kbase.workspace.exceptions.WorkspaceAuthorizationException; diff --git a/src/us/kbase/workspace/test/WorkspaceTestCommon.java b/src/us/kbase/workspace/test/WorkspaceTestCommon.java index b402509db..43d504ed9 100644 --- a/src/us/kbase/workspace/test/WorkspaceTestCommon.java +++ b/src/us/kbase/workspace/test/WorkspaceTestCommon.java @@ -1,5 +1,7 @@ package us.kbase.workspace.test; +import static us.kbase.common.test.TestCommon.now; + import java.util.Arrays; import java.util.Map; @@ -9,6 +11,7 @@ import us.kbase.typedobj.core.TypeDefName; import us.kbase.workspace.database.Types; import us.kbase.workspace.database.WorkspaceUser; +import us.kbase.workspace.database.provenance.Provenance; public class WorkspaceTestCommon { @@ -75,4 +78,8 @@ public static void installBasicSpecs(final WorkspaceUser user, final Types t) null, null, null, false, null); t.releaseTypes(user, "SomeModule"); } + + public static Provenance basicProv(final WorkspaceUser u) { + return Provenance.getBuilder(u, now()).build(); + } } diff --git a/src/us/kbase/workspace/test/database/mongo/MongoInternalsTest.java b/src/us/kbase/workspace/test/database/mongo/MongoInternalsTest.java index d38a35521..fda20e327 100644 --- a/src/us/kbase/workspace/test/database/mongo/MongoInternalsTest.java +++ b/src/us/kbase/workspace/test/database/mongo/MongoInternalsTest.java @@ -5,6 +5,8 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static us.kbase.common.test.TestCommon.now; +import static us.kbase.workspace.test.WorkspaceTestCommon.basicProv; import java.io.File; import java.lang.reflect.Constructor; @@ -53,7 +55,6 @@ import us.kbase.workspace.database.ObjectIdentifier; import us.kbase.workspace.database.ObjectInformation; import us.kbase.workspace.database.Permission; -import us.kbase.workspace.database.Provenance; import us.kbase.workspace.database.Reference; import us.kbase.workspace.database.ResolvedSaveObject; import us.kbase.workspace.database.ResolvedWorkspaceID; @@ -74,6 +75,7 @@ import us.kbase.workspace.database.mongo.IDName; import us.kbase.workspace.database.mongo.MongoWorkspaceDB; import us.kbase.workspace.database.mongo.ObjectSavePackage; +import us.kbase.workspace.database.provenance.Provenance; import us.kbase.workspace.test.workspace.WorkspaceTester; import com.mongodb.MongoClient; @@ -237,7 +239,7 @@ public void cloningWorkspaceInaccessible() throws Exception { final WorkspaceUser user2 = new WorkspaceUser("whoop"); final Map mt = new HashMap<>(); - final Provenance p = new Provenance(user1); + final Provenance p = basicProv(user1); // make a normal workspace & save objects ws.createWorkspace(user2, "bar", false, null, @@ -569,8 +571,8 @@ public void raceConditionRevertObjectId() throws Exception { moredata.put("foo", "bar"); data.put("fubar", moredata); meta.put("metastuff", "meta"); - Provenance p = new Provenance(new WorkspaceUser("kbasetest2")); - setWsidOnProvenance(wsid, p); + final Provenance p = Provenance.getBuilder(new WorkspaceUser("kbasetest2"), now()) + .withWorkspaceID(wsid).build(); TypeDefId t = new TypeDefId(new TypeDefName("SomeModule", "AType"), 0, 1); AbsoluteTypeDefId at = new AbsoluteTypeDefId(new TypeDefName("SomeModule", "AType"), 0, 1); @@ -581,11 +583,12 @@ public void raceConditionRevertObjectId() throws Exception { new DummyValidatedTypedObject(at, wso.getData()); dummy.calculateRelabeledSize(); dummy.sort(new UTF8JsonSorterFactory(100000)); + final ResolvedWorkspaceID rwsi = mwdb.resolveWorkspace(wsi); ResolvedSaveObject rso = wso.resolve( + rwsi, dummy, new HashSet(), new LinkedList(), new HashMap>()); - final ResolvedWorkspaceID rwsi = mwdb.resolveWorkspace(wsi); mwdb.saveObjects(user, rwsi, Arrays.asList(rso)); IDnPackage inp = startSaveObject(rwsi, rso, 3, at); @@ -614,15 +617,6 @@ public void raceConditionRevertObjectId() throws Exception { assertThat("objectid is revised to existing object", md.getObjectId(), is(1L)); } - private void setWsidOnProvenance(long wsid, Provenance p) - throws NoSuchMethodException, IllegalAccessException, - InvocationTargetException { - Method setWsid = p.getClass().getDeclaredMethod("setWorkspaceID", - Long.class); - setWsid.setAccessible(true); - setWsid.invoke(p, Long.valueOf(wsid)); - } - @Test public void setGetRaceCondition() throws Exception { String objname = "testobj"; @@ -636,15 +630,15 @@ public void setGetRaceCondition() throws Exception { .getId(); final Map data = new HashMap(); - Provenance p = new Provenance(new WorkspaceUser("kbasetest2")); - setWsidOnProvenance(wsid, p); + final Provenance p = Provenance.getBuilder(new WorkspaceUser("kbasetest2"), now()) + .withWorkspaceID(wsid).build(); TypeDefId t = new TypeDefId(new TypeDefName("SomeModule", "AType"), 0, 1); AbsoluteTypeDefId at = new AbsoluteTypeDefId( new TypeDefName("SomeModule", "AType"), 0, 1); - ResolvedSaveObject rso = createResolvedWSObj(objname, data, p, t, at); - ResolvedSaveObject rso2 = createResolvedWSObj(objname2, data, p, t, at); final ResolvedWorkspaceID rwsi = mwdb.resolveWorkspace(wsi); + ResolvedSaveObject rso = createResolvedWSObj(rwsi, objname, data, p, t, at); + ResolvedSaveObject rso2 = createResolvedWSObj(rwsi, objname2, data, p, t, at); startSaveObject(rwsi, rso, 1, at); mwdb.saveObjects(user, rwsi, Arrays.asList(rso2)); //objid 2 @@ -776,17 +770,23 @@ private void failGetObjectsNoSuchObjectExcp( } } - private ResolvedSaveObject createResolvedWSObj(String objname, - final Map data, Provenance p, TypeDefId t, - AbsoluteTypeDefId at) throws Exception { - WorkspaceSaveObject wso = new WorkspaceSaveObject( + private ResolvedSaveObject createResolvedWSObj( + final ResolvedWorkspaceID rwsi, + final String objname, + final Map data, + final Provenance p, + final TypeDefId t, + final AbsoluteTypeDefId at) + throws Exception { + final WorkspaceSaveObject wso = new WorkspaceSaveObject( new ObjectIDNoWSNoVer(objname), new UObject(data), t, null, p, false); final DummyValidatedTypedObject dummy = new DummyValidatedTypedObject(at, wso.getData()); dummy.calculateRelabeledSize(); dummy.sort(new UTF8JsonSorterFactory(100000)); - ResolvedSaveObject rso = wso.resolve( + final ResolvedSaveObject rso = wso.resolve( + rwsi, dummy, new HashSet(), new LinkedList(), new HashMap>()); @@ -854,7 +854,7 @@ public void refCounting() throws Exception { WorkspaceIdentifier wspace = new WorkspaceIdentifier("refcount"); long wsid = ws.createWorkspace(userfoo, wspace.getName(), false, null, null).getId(); - Provenance emptyprov = new Provenance(userfoo); + final Provenance emptyprov = basicProv(userfoo); Map data1 = new HashMap(); data1.put("foo", 3); @@ -948,18 +948,19 @@ private void testCopyRevert(Boolean hide, long wsid = ws.createWorkspace(userfoo, copyrev.getName(), false, null, null).getId(); Map data = new HashMap(); + final Provenance p = basicProv(userfoo); ws.saveObjects(userfoo, copyrev, Arrays.asList( new WorkspaceSaveObject(getRandomName(), new UObject(data), SAFE_TYPE, null, - new Provenance(userfoo), hide)), fac); + p, hide)), fac); ws.saveObjects(userfoo, copyrev, Arrays.asList( new WorkspaceSaveObject(getRandomName(), new UObject(data), SAFE_TYPE, null, - new Provenance(userfoo), hide)), fac); + p, hide)), fac); ws.saveObjects(userfoo, copyrev, Arrays.asList( new WorkspaceSaveObject(new ObjectIDNoWSNoVer(2), new UObject(data), SAFE_TYPE, - null, new Provenance(userfoo), hide)), fac); + null, p, hide)), fac); ws.saveObjects(userfoo, copyrev, Arrays.asList( new WorkspaceSaveObject(new ObjectIDNoWSNoVer(2), new UObject(data), SAFE_TYPE, - null, new Provenance(userfoo), hide)), fac); + null, p, hide)), fac); ws.copyObject( userfoo, ObjectIdentifier.getBuilder(copyrev).withID(2L).withVersion(2).build(), @@ -1066,7 +1067,7 @@ public void dates() throws Exception { Map data = new HashMap(); ws.saveObjects(userfoo, dates, Arrays.asList( new WorkspaceSaveObject(new ObjectIDNoWSNoVer("orig"), new UObject(data), - SAFE_TYPE, null, new Provenance(userfoo), false)), + SAFE_TYPE, null, basicProv(userfoo), false)), fac); Date orig = getDate(wsid, 1); ws.copyObject( @@ -1117,11 +1118,12 @@ private void typeFieldsSetUp() throws Exception { ws.createWorkspace(user, wsi.getName(), false, null, null).getId(); final Map data = new HashMap<>(); + final Provenance p = basicProv(user); ws.saveObjects(user, wsi, Arrays.asList( new WorkspaceSaveObject(new ObjectIDNoWSNoVer("orig"), new UObject(data), - SAFE_TYPE, null, new Provenance(user), false), + SAFE_TYPE, null, p, false), new WorkspaceSaveObject(new ObjectIDNoWSNoVer("orig2"), new UObject(data), - OTHER_TYPE_NO_VER, null, new Provenance(user), false)), + OTHER_TYPE_NO_VER, null, p, false)), fac); } diff --git a/src/us/kbase/workspace/test/database/mongo/MongoWorkspaceDBTest.java b/src/us/kbase/workspace/test/database/mongo/MongoWorkspaceDBTest.java index 07bc08c05..dfc44ebb7 100644 --- a/src/us/kbase/workspace/test/database/mongo/MongoWorkspaceDBTest.java +++ b/src/us/kbase/workspace/test/database/mongo/MongoWorkspaceDBTest.java @@ -1,7 +1,6 @@ package us.kbase.workspace.test.database.mongo; import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.nullValue; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.mockito.Mockito.mock; @@ -10,6 +9,7 @@ import static us.kbase.common.test.TestCommon.list; import static us.kbase.common.test.TestCommon.opt; import static us.kbase.common.test.TestCommon.set; +import static us.kbase.workspace.test.WorkspaceTestCommon.basicProv; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -52,7 +52,6 @@ import us.kbase.workspace.database.ByteArrayFileCacheManager; import us.kbase.workspace.database.ObjectIDResolvedWS; import us.kbase.workspace.database.ObjectInformation; -import us.kbase.workspace.database.Provenance; import us.kbase.workspace.database.Reference; import us.kbase.workspace.database.exceptions.CorruptWorkspaceDBException; import us.kbase.workspace.database.exceptions.NoObjectDataException; @@ -74,6 +73,7 @@ import us.kbase.workspace.database.mongo.exceptions.BlobStoreAuthorizationException; import us.kbase.workspace.database.mongo.exceptions.BlobStoreCommunicationException; import us.kbase.workspace.database.mongo.exceptions.NoSuchBlobException; +import us.kbase.workspace.database.provenance.Provenance; import us.kbase.workspace.database.provenance.ProvenanceAction; //TODO TEST start moving a bunch of the tests from Workspace test to here, and use mocks in workspace test. @@ -135,9 +135,10 @@ public void getProvenanceWithNullFields() throws Exception { final WorkspaceUser u = new WorkspaceUser("u"); mocks.mdb.createWorkspace(u, "ws", false, null, new WorkspaceUserMetadata()); - final Provenance p = new Provenance(u, new Date(10000)); - p.setWorkspaceID(1L); - p.addAction(ProvenanceAction.getBuilder().withCaller("call").build()); + final Provenance p = Provenance.getBuilder(u, inst(10000)) + .withWorkspaceID(1L) + .withAction(ProvenanceAction.getBuilder().withCaller("call").build()) + .build(); final ResolvedWorkspaceID wsid = new ResolvedWorkspaceID(1, "ws", false, false); mocks.saveTestObject(wsid, u, p, "newobj", "Mod.Type-5.1", @@ -162,8 +163,8 @@ public void getProvenanceWithNullFields() throws Exception { //TODO TEST add equals methods to provenance classes & test & use here assertThat("incorrect user", pgot.getUser(), is(new WorkspaceUser("u"))); - assertThat("incorrect date", pgot.getDate(), is(new Date(10000))); - assertThat("incorrect wsid", pgot.getWorkspaceID(), nullValue()); + assertThat("incorrect date", pgot.getDate(), is(inst(10000))); + assertThat("incorrect wsid", pgot.getWorkspaceID(), is(Optional.empty())); assertThat("incorrect action count", pgot.getActions().size(), is(1)); final ProvenanceAction pagot = pgot.getActions().get(0); @@ -179,8 +180,7 @@ public void getObjectWithoutExternalIDsField() throws Exception { final WorkspaceUser u = new WorkspaceUser("u"); mocks.mdb.createWorkspace(u, "ws", false, null, new WorkspaceUserMetadata()); - final Provenance p = new Provenance(u, new Date(10000)); - p.setWorkspaceID(1L); + final Provenance p = Provenance.getBuilder(u, inst(10000)).withWorkspaceID(1L).build(); final ResolvedWorkspaceID wsid = new ResolvedWorkspaceID(1, "ws", false, false); mocks.saveTestObject(wsid, u, p, "newobj", "Mod.Type-5.1", @@ -317,7 +317,7 @@ private Set setupTestDataForHideDelete( mocks.mdb.createWorkspace(u, "ws2", false, null, new WorkspaceUserMetadata()); // save objects - final Provenance p = new Provenance(u); + final Provenance p = basicProv(u); final String type = "Mod.Type-5.1"; mocks.saveTestObject(wsid, u, p, "newobj", type, "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", 22L); @@ -415,7 +415,7 @@ public void addDataToObjectsNoop() throws Exception { } private List addDataToObjectsSetup() { - final Provenance p = new Provenance(new WorkspaceUser("user1")); + final Provenance p = basicProv(new WorkspaceUser("user1")); final List objects = list( WorkspaceObjectData.getBuilder( new ObjectInformation( @@ -700,7 +700,7 @@ public void addDataToObjectsBackendScaling() throws Exception { o.getRep().getMD5().getMD5(), o.getRep().getRelabeledSize(), null), - new Provenance(u)) + basicProv(u)) .withSubsetSelection(new SubsetSelection(list("baz")))); counter++; } @@ -735,14 +735,14 @@ private List saveObjects( new UObject(ImmutableMap.of("foo", "bar", "baz", "bat" + i)), new TypeDefId("Mod.Meth"), null, - new Provenance(new WorkspaceUser("u1")), + basicProv(new WorkspaceUser("u1")), false); final DummyValidatedTypedObject dummy = new DummyValidatedTypedObject( AbsoluteTypeDefId.fromAbsoluteTypeString("Mod.Meth-1.0"), wso.getData()); dummy.calculateRelabeledSize(); dummy.sort(new UTF8JsonSorterFactory(100000)); - objects.add(wso.resolve(dummy, set(), list(), Collections.emptyMap())); + objects.add(wso.resolve(ws, dummy, set(), list(), Collections.emptyMap())); } db.saveObjects(new WorkspaceUser("u1"), ws, objects); diff --git a/src/us/kbase/workspace/test/database/mongo/PartialMock.java b/src/us/kbase/workspace/test/database/mongo/PartialMock.java index c0f611bbb..0063ec0a3 100644 --- a/src/us/kbase/workspace/test/database/mongo/PartialMock.java +++ b/src/us/kbase/workspace/test/database/mongo/PartialMock.java @@ -22,13 +22,13 @@ import us.kbase.typedobj.core.ValidatedTypedObject; import us.kbase.workspace.database.ObjectIDNoWSNoVer; import us.kbase.workspace.database.ObjectInformation; -import us.kbase.workspace.database.Provenance; import us.kbase.workspace.database.Reference; import us.kbase.workspace.database.ResolvedWorkspaceID; import us.kbase.workspace.database.WorkspaceSaveObject; import us.kbase.workspace.database.WorkspaceUser; import us.kbase.workspace.database.mongo.BlobStore; import us.kbase.workspace.database.mongo.MongoWorkspaceDB; +import us.kbase.workspace.database.provenance.Provenance; /** Create a {@link MongoWorkspaceDB} instance with a real Mongo DB but all other dependencies * mocked. Useful for manipulating clock times or when actual object data is not involved in @@ -82,6 +82,7 @@ public Reference saveTestObject( prov, false) .resolve( + wsid, vto, set(), Collections.emptyList(), diff --git a/src/us/kbase/workspace/test/database/mongo/SchemaUpdaterTest.java b/src/us/kbase/workspace/test/database/mongo/SchemaUpdaterTest.java index f9eef1464..8d18d62d0 100644 --- a/src/us/kbase/workspace/test/database/mongo/SchemaUpdaterTest.java +++ b/src/us/kbase/workspace/test/database/mongo/SchemaUpdaterTest.java @@ -4,6 +4,7 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; import static org.mockito.Mockito.when; +import static us.kbase.workspace.test.WorkspaceTestCommon.basicProv; import java.nio.file.Paths; import java.time.Instant; @@ -28,13 +29,13 @@ import us.kbase.common.test.TestCommon; import us.kbase.common.test.controllers.mongo.MongoController; -import us.kbase.workspace.database.Provenance; import us.kbase.workspace.database.ResolvedWorkspaceID; import us.kbase.workspace.database.WorkspaceUser; import us.kbase.workspace.database.WorkspaceUserMetadata; import us.kbase.workspace.database.mongo.MongoWorkspaceDB; import us.kbase.workspace.database.mongo.SchemaUpdater; -import us.kbase.workspace.database.mongo.SchemaUpdater.SchemaUpdateException;; +import us.kbase.workspace.database.mongo.SchemaUpdater.SchemaUpdateException; +import us.kbase.workspace.database.provenance.Provenance; public class SchemaUpdaterTest { @@ -88,7 +89,7 @@ private static void setUpTestDB() throws Exception { final ResolvedWorkspaceID ws2 = new ResolvedWorkspaceID(2, "two", false, false); final ResolvedWorkspaceID ws3 = new ResolvedWorkspaceID(3, "three", false, false); - final Provenance p = new Provenance(u); + final Provenance p = basicProv(u); pm.saveTestObject(ws1, u, p, "o1", "Mod1.Type1-7.2", MD5PRE + "01", 1); pm.saveTestObject(ws1, u, p, "o2", "Mod1.Type1-7.2", MD5PRE + "02", 1); pm.saveTestObject(ws1, u, p, "o2", "Mod1.Type1-7.2", MD5PRE + "03", 1); diff --git a/src/us/kbase/workspace/test/database/provenance/ProvenanceTest.java b/src/us/kbase/workspace/test/database/provenance/ProvenanceTest.java new file mode 100644 index 000000000..3ac584850 --- /dev/null +++ b/src/us/kbase/workspace/test/database/provenance/ProvenanceTest.java @@ -0,0 +1,209 @@ +package us.kbase.workspace.test.database.provenance; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.fail; +import static us.kbase.common.test.TestCommon.inst; +import static us.kbase.common.test.TestCommon.list; + +import java.time.Instant; +import java.util.Collections; +import java.util.Optional; + +import org.junit.Test; + +import nl.jqno.equalsverifier.EqualsVerifier; +import us.kbase.common.test.TestCommon; +import us.kbase.workspace.database.WorkspaceUser; +import us.kbase.workspace.database.provenance.Provenance; +import us.kbase.workspace.database.provenance.ProvenanceAction; + +public class ProvenanceTest { + + @Test + public void equals() throws Exception { + EqualsVerifier.forClass(Provenance.class).usingGetClass().verify(); + } + + @Test + public void buildMinimal() throws Exception { + final Provenance p = Provenance.getBuilder( + new WorkspaceUser("u"), inst(4500)).build(); + + assertThat("incorrect actions", p.getActions(), is(Collections.emptyList())); + assertThat("incorrect date", p.getDate(), is(inst(4500))); + assertThat("incorrect user", p.getUser(), is(new WorkspaceUser("u"))); + assertThat("incorrect wsid", p.getWorkspaceID(), is(Optional.empty())); + } + + @Test + public void buildMaximal1Action() throws Exception { + final Provenance p = Provenance.getBuilder( + new WorkspaceUser("user"), inst(1234)) + .withWorkspaceID(1L) + .withAction(ProvenanceAction.getBuilder().withCaller("c").build()) + .build(); + + assertThat("incorrect actions", p.getActions(), is(list( + ProvenanceAction.getBuilder().withCaller("c").build()))); + assertThat("incorrect date", p.getDate(), is(inst(1234))); + assertThat("incorrect user", p.getUser(), is(new WorkspaceUser("user"))); + assertThat("incorrect wsid", p.getWorkspaceID(), is(Optional.of(1L))); + } + + @Test + public void buildMaximal3Actions() throws Exception { + final Provenance p = Provenance.getBuilder( + new WorkspaceUser("user1"), inst(10000)) + .withWorkspaceID(15671L) + .withAction(ProvenanceAction.getBuilder().withCaller("c").build()) + .withAction(ProvenanceAction.getBuilder().withScript("s").build()) + .withAction(ProvenanceAction.getBuilder().withDescription("d").build()) + .build(); + + assertThat("incorrect actions", p.getActions(), is(list( + ProvenanceAction.getBuilder().withCaller("c").build(), + ProvenanceAction.getBuilder().withScript("s").build(), + ProvenanceAction.getBuilder().withDescription("d").build() + ))); + assertThat("incorrect date", p.getDate(), is(inst(10000))); + assertThat("incorrect user", p.getUser(), is(new WorkspaceUser("user1"))); + assertThat("incorrect wsid", p.getWorkspaceID(), is(Optional.of(15671L))); + } + + @Test + public void buildWithNullWsid() throws Exception { + final Provenance p = Provenance.getBuilder( + new WorkspaceUser("user"), inst(1234)) + .withWorkspaceID(null) + .build(); + + assertThat("incorrect actions", p.getActions(), is(Collections.emptyList())); + assertThat("incorrect date", p.getDate(), is(inst(1234))); + assertThat("incorrect user", p.getUser(), is(new WorkspaceUser("user"))); + assertThat("incorrect wsid", p.getWorkspaceID(), is(Optional.empty())); + } + + @Test + public void immutableActions() throws Exception { + // test empty list + final Provenance p = Provenance.getBuilder( + new WorkspaceUser("user"), inst(1234)) + .build(); + try { + p.getActions().add(ProvenanceAction.getBuilder().withCaller("c").build()); + fail("expected exception"); + } catch (UnsupportedOperationException e) { + // test passed + } + + // test filled list + final Provenance p2 = Provenance.getBuilder( + new WorkspaceUser("user"), inst(1234)) + .withAction(ProvenanceAction.getBuilder().withCaller("c").build()) + .build(); + try { + p2.getActions().remove(0); + fail("expected exception"); + } catch (UnsupportedOperationException e) { + // test passed + } + } + + @Test + public void getBuilderFail() throws Exception { + failGetBuilder(null, inst(0), new NullPointerException("user")); + failGetBuilder(new WorkspaceUser("u"), null, new NullPointerException("date")); + } + + private void failGetBuilder( + final WorkspaceUser u, + final Instant date, + final Exception expected) { + try { + Provenance.getBuilder(u, date); + fail("expected exception"); + } catch (Exception got) { + TestCommon.assertExceptionCorrect(got, expected); + } + } + + @Test + public void withWorkspaceIDFail() throws Exception { + failWithWorkspaceID(0L, new IllegalArgumentException("workspace ID must be > 0")); + failWithWorkspaceID(-1L, new IllegalArgumentException("workspace ID must be > 0")); + failWithWorkspaceID(-100L, new IllegalArgumentException("workspace ID must be > 0")); + } + + private void failWithWorkspaceID(final Long workspaceID, final Exception expected) { + try { + Provenance.getBuilder(new WorkspaceUser("u"), inst(0)).withWorkspaceID(workspaceID); + fail("expected exception"); + } catch (Exception got) { + TestCommon.assertExceptionCorrect(got, expected); + } + } + + @Test + public void withProvenanceActionFail() throws Exception { + try { + Provenance.getBuilder(new WorkspaceUser("u"), inst(0)).withAction(null); + fail("expected exception"); + } catch (Exception got) { + TestCommon.assertExceptionCorrect(got, new NullPointerException("action")); + } + + } + + @Test + public void updateWorkspaceIDNoIDs() throws Exception { + final Provenance p = Provenance.getBuilder(new WorkspaceUser("u"), inst(0)).build(); + final Provenance newp = p.updateWorkspaceID(null); + + assertThat("provenance identity true", p == newp, is(true)); + } + + @Test + public void updateWorkspaceIDSameIDs() throws Exception { + final Provenance p = Provenance.getBuilder(new WorkspaceUser("u"), inst(0)) + .withWorkspaceID(75L).build(); + final Provenance newp = p.updateWorkspaceID(75L); + + assertThat("provenance identity true", p == newp, is(true)); + } + + @Test + public void updateWorkspaceIDRemoveID() throws Exception { + final Provenance p = Provenance.getBuilder(new WorkspaceUser("u"), inst(0)) + .withWorkspaceID(75L).build(); + final Provenance newp = p.updateWorkspaceID(null); + + assertThat("incorrect provenance", + newp, is(Provenance.getBuilder(new WorkspaceUser("u"), inst(0)).build())); + } + + @Test + public void updateWorkspaceIDAddID() throws Exception { + final Provenance p = Provenance.getBuilder(new WorkspaceUser("u"), inst(0)).build(); + final Provenance newp = p.updateWorkspaceID(34L); + + assertThat("incorrect provenance", newp, is(Provenance.getBuilder( + new WorkspaceUser("u"), inst(0)).withWorkspaceID(34L).build())); + } + + @Test + public void updateWorkspaceIDFail() throws Exception { + failUpdateWorkspaceID(0L, new IllegalArgumentException("workspace ID must be > 0")); + failUpdateWorkspaceID(-1L, new IllegalArgumentException("workspace ID must be > 0")); + failUpdateWorkspaceID(-1234L, new IllegalArgumentException("workspace ID must be > 0")); + } + + private void failUpdateWorkspaceID(final Long wsid, final Exception expected) { + try { + Provenance.getBuilder(new WorkspaceUser("u"), inst(0)).build().updateWorkspaceID(wsid); + fail("expected exception"); + } catch (Exception got) { + TestCommon.assertExceptionCorrect(got, expected); + } + } +} diff --git a/src/us/kbase/workspace/test/workspace/ProvenanceTest.java b/src/us/kbase/workspace/test/workspace/ProvenanceTest.java deleted file mode 100644 index 3616c59e4..000000000 --- a/src/us/kbase/workspace/test/workspace/ProvenanceTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package us.kbase.workspace.test.workspace; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.nullValue; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.fail; - -import org.junit.Test; - -import us.kbase.common.test.TestCommon; -import us.kbase.workspace.database.Provenance; -import us.kbase.workspace.database.WorkspaceUser; - -public class ProvenanceTest { - - //TODO TEST add more tests - - @Test - public void setAndGetWorkspaceID() throws Exception { - final Provenance p = new Provenance(new WorkspaceUser("u")); - - p.setWorkspaceID(1L); - assertThat("incorrect wsid", p.getWorkspaceID(), is(1L)); - - p.setWorkspaceID(null); - assertThat("incorrect wsid", p.getWorkspaceID(), is(nullValue())); - } - - @Test - public void failSetWorkspaceID() throws Exception { - try { - new Provenance(new WorkspaceUser("u")).setWorkspaceID(0L); - fail("expected exception"); - } catch (Exception got) { - TestCommon.assertExceptionCorrect(got, - new IllegalArgumentException("wsid must be > 0")); - } - } - -} diff --git a/src/us/kbase/workspace/test/workspace/WorkspaceIntegrationWithGridFSTest.java b/src/us/kbase/workspace/test/workspace/WorkspaceIntegrationWithGridFSTest.java index 94a92a26e..f67299edc 100644 --- a/src/us/kbase/workspace/test/workspace/WorkspaceIntegrationWithGridFSTest.java +++ b/src/us/kbase/workspace/test/workspace/WorkspaceIntegrationWithGridFSTest.java @@ -2,6 +2,7 @@ import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; +import static us.kbase.workspace.test.WorkspaceTestCommon.basicProv; import static us.kbase.workspace.test.WorkspaceTestCommon.SAFE_DATA; import static us.kbase.workspace.test.WorkspaceTestCommon.SAFE_DATA_MD5; import static us.kbase.workspace.test.WorkspaceTestCommon.SAFE_DATA_SIZE; @@ -54,7 +55,6 @@ import us.kbase.workspace.database.ObjectIDNoWSNoVer; import us.kbase.workspace.database.ObjectIdentifier; import us.kbase.workspace.database.ObjectInformation; -import us.kbase.workspace.database.Provenance; import us.kbase.workspace.database.RefLimit; import us.kbase.workspace.database.ResolvedWorkspaceID; import us.kbase.workspace.database.ResourceUsageConfigurationBuilder; @@ -65,6 +65,7 @@ import us.kbase.workspace.database.WorkspaceUser; import us.kbase.workspace.database.mongo.GridFSBlobStore; import us.kbase.workspace.database.mongo.MongoWorkspaceDB; +import us.kbase.workspace.database.provenance.Provenance; import us.kbase.workspace.test.WorkspaceTestCommon; /** Workspace library level integration tests that don't need to be run against multiple @@ -196,7 +197,7 @@ private void saveObjects( final int end, // exclusive final Function typeResolver) throws Exception { - final Provenance p = new Provenance(USER); + final Provenance p = basicProv(USER); final List objects = IntStream.range(start, end) .mapToObj(i -> new WorkspaceSaveObject( objID("o" + (i + 1)), SAFE_DATA, typeResolver.apply(i), null, p, false)) diff --git a/src/us/kbase/workspace/test/workspace/WorkspaceListenerTest.java b/src/us/kbase/workspace/test/workspace/WorkspaceListenerTest.java index 02cca99ab..015b90846 100644 --- a/src/us/kbase/workspace/test/workspace/WorkspaceListenerTest.java +++ b/src/us/kbase/workspace/test/workspace/WorkspaceListenerTest.java @@ -11,6 +11,7 @@ import static org.mockito.Mockito.when; import static org.mockito.Mockito.verify; import static us.kbase.common.test.TestCommon.set; +import static us.kbase.workspace.test.WorkspaceTestCommon.basicProv; import java.time.Instant; import java.util.Arrays; @@ -42,7 +43,6 @@ import us.kbase.workspace.database.ObjectInformation; import us.kbase.workspace.database.Permission; import us.kbase.workspace.database.PermissionSet; -import us.kbase.workspace.database.Provenance; import us.kbase.workspace.database.ResolvedObjectIDNoVer; import us.kbase.workspace.database.ResolvedSaveObject; import us.kbase.workspace.database.ResolvedWorkspaceID; @@ -1019,15 +1019,15 @@ public void saveObject1Listener() throws Exception { final WorkspaceSaveObject wso1 = new WorkspaceSaveObject( new ObjectIDNoWSNoVer("foo1"), new HashMap<>(), - new TypeDefId("foo.bar"), null, new Provenance(user), false); + new TypeDefId("foo.bar"), null, basicProv(user), false); final WorkspaceSaveObject wso2 = new WorkspaceSaveObject( new ObjectIDNoWSNoVer("foo2"), new HashMap<>(), - new TypeDefId("foo.baz"), null, new Provenance(user), false); + new TypeDefId("foo.baz"), null, basicProv(user), false); - final ResolvedSaveObject rso1 = wso1.resolve(vto1, set(), Collections.emptyList(), + final ResolvedSaveObject rso1 = wso1.resolve(rwsi, vto1, set(), Collections.emptyList(), Collections.emptyMap()); - final ResolvedSaveObject rso2 = wso2.resolve(vto1, set(), Collections.emptyList(), + final ResolvedSaveObject rso2 = wso2.resolve(rwsi, vto1, set(), Collections.emptyList(), Collections.emptyMap()); final ObjectInformation oi1 = new ObjectInformation( @@ -1088,15 +1088,15 @@ public void saveObject2Listeners() throws Exception { final WorkspaceSaveObject wso1 = new WorkspaceSaveObject( new ObjectIDNoWSNoVer("foo1"), new HashMap<>(), - new TypeDefId("foo.bar"), null, new Provenance(user), false); + new TypeDefId("foo.bar"), null, basicProv(user), false); final WorkspaceSaveObject wso2 = new WorkspaceSaveObject( new ObjectIDNoWSNoVer("foo2"), new HashMap<>(), - new TypeDefId("foo.baz"), null, new Provenance(user), false); + new TypeDefId("foo.baz"), null, basicProv(user), false); - final ResolvedSaveObject rso1 = wso1.resolve(vto1, set(), Collections.emptyList(), + final ResolvedSaveObject rso1 = wso1.resolve(rwsi, vto1, set(), Collections.emptyList(), Collections.emptyMap()); - final ResolvedSaveObject rso2 = wso2.resolve(vto1, set(), Collections.emptyList(), + final ResolvedSaveObject rso2 = wso2.resolve(rwsi, vto1, set(), Collections.emptyList(), Collections.emptyMap()); final ObjectInformation oi1 = new ObjectInformation( diff --git a/src/us/kbase/workspace/test/workspace/WorkspaceLongTest.java b/src/us/kbase/workspace/test/workspace/WorkspaceLongTest.java index c5adccabc..cef68d5b1 100644 --- a/src/us/kbase/workspace/test/workspace/WorkspaceLongTest.java +++ b/src/us/kbase/workspace/test/workspace/WorkspaceLongTest.java @@ -2,8 +2,10 @@ import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; -import static us.kbase.workspace.test.LongTextForTestUsage.TEXT1000; import static us.kbase.common.test.TestCommon.opt; +import static us.kbase.workspace.test.LongTextForTestUsage.TEXT1000; +import static us.kbase.workspace.test.WorkspaceTestCommon.basicProv; + import java.io.File; import java.io.InputStream; @@ -31,12 +33,12 @@ import us.kbase.workspace.database.ObjectIDNoWSNoVer; import us.kbase.workspace.database.ObjectIdentifier; import us.kbase.workspace.database.ObjectInformation; -import us.kbase.workspace.database.Provenance; import us.kbase.workspace.database.WorkspaceIdentifier; import us.kbase.workspace.database.WorkspaceInformation; import us.kbase.workspace.database.WorkspaceObjectData; import us.kbase.workspace.database.WorkspaceSaveObject; import us.kbase.workspace.database.WorkspaceUser; +import us.kbase.workspace.database.provenance.Provenance; import com.fasterxml.jackson.core.JsonEncoding; import com.fasterxml.jackson.core.JsonGenerator; @@ -74,7 +76,7 @@ public void saveWithBigData() throws Exception { UObject data = new UObject(tempFile); ws.saveObjects(userfoo, bigdataws, Arrays.asList( //should work new WorkspaceSaveObject(getRandomName(), data, SAFE_TYPE1, null, - new Provenance(userfoo), false)), getIdFactory()); + basicProv(userfoo), false)), getIdFactory()); } finally { tempFile.delete(); } @@ -150,7 +152,7 @@ public void tenKrefs() throws Exception { WorkspaceIdentifier wspace = new WorkspaceIdentifier("tenKrefs"); WorkspaceInformation wi = ws.createWorkspace(userfoo, wspace.getName(), false, null, null); long wsid = wi.getId(); - Provenance emptyprov = new Provenance(userfoo); + Provenance emptyprov = basicProv(userfoo); Map torefdata = new HashMap(); torefdata.put("foo", 3.2); torefdata.put("baz", "astring"); @@ -233,7 +235,7 @@ public void unicode() throws Exception { } ws.saveObjects(userfoo, unicode, Arrays.asList( new WorkspaceSaveObject(getRandomName(), data, SAFE_TYPE1, null, - new Provenance(userfoo), false)), getIdFactory()); + basicProv(userfoo), false)), getIdFactory()); final List objects = getObjects( ws, userfoo, @@ -259,7 +261,7 @@ public void unicode() throws Exception { data.put(test, "foo"); ws.saveObjects(userfoo, unicode, Arrays.asList( new WorkspaceSaveObject(getRandomName(), data, SAFE_TYPE1, null, - new Provenance(userfoo), false)), getIdFactory()); + basicProv(userfoo), false)), getIdFactory()); final List objects2 = getObjects( ws, userfoo, @@ -284,7 +286,7 @@ public void listObjectsLimit() throws Exception { List objs = new LinkedList(); for (int i = 0; i < 20000; i++) { objs.add(new WorkspaceSaveObject(getRandomName(), new HashMap(), - SAFE_TYPE1, null, new Provenance(user), false)); + SAFE_TYPE1, null, basicProv(user), false)); } ws.saveObjects(user, wsi, objs, getIdFactory()); @@ -333,7 +335,7 @@ public void getObjectSubset() throws Exception { TypeDefId emptyType = new TypeDefId(new TypeDefName(mod, type2), 0, 1); WorkspaceIdentifier wspace = new WorkspaceIdentifier("testGetObjectSubset"); ws.createWorkspace(userfoo, wspace.getName(), false, null, null); - Provenance emptyprov = new Provenance(userfoo); + Provenance emptyprov = basicProv(userfoo); InputStream is = new GZIPInputStream(this.getClass().getResourceAsStream("long_test_get_object_subset.json.gz.properties")); Map data = UObject.getMapper().readValue(is, Map.class); List wsos = new LinkedList(); diff --git a/src/us/kbase/workspace/test/workspace/WorkspaceObjectDataTest.java b/src/us/kbase/workspace/test/workspace/WorkspaceObjectDataTest.java index b610add9d..a6ccb9541 100644 --- a/src/us/kbase/workspace/test/workspace/WorkspaceObjectDataTest.java +++ b/src/us/kbase/workspace/test/workspace/WorkspaceObjectDataTest.java @@ -5,6 +5,7 @@ import static org.junit.Assert.fail; import static us.kbase.common.test.TestCommon.assertExceptionCorrect; import static us.kbase.common.test.TestCommon.opt; +import static us.kbase.workspace.test.WorkspaceTestCommon.basicProv; import java.io.ByteArrayInputStream; import java.io.IOException; @@ -24,11 +25,11 @@ import us.kbase.typedobj.idref.IdReferenceType; import us.kbase.workspace.database.ByteArrayFileCacheManager; import us.kbase.workspace.database.ObjectInformation; -import us.kbase.workspace.database.Provenance; import us.kbase.workspace.database.Reference; import us.kbase.workspace.database.ResolvedWorkspaceID; import us.kbase.workspace.database.WorkspaceObjectData; import us.kbase.workspace.database.WorkspaceUser; +import us.kbase.workspace.database.provenance.Provenance; import us.kbase.workspace.database.ByteArrayFileCacheManager.ByteArrayFileCache; public class WorkspaceObjectDataTest { @@ -38,7 +39,8 @@ public class WorkspaceObjectDataTest { private static final SubsetSelection OS = SubsetSelection.EMPTY; // Provenance really needs a rework and has no hashCode(), so we use identity equality for now - private static final Provenance PROV = new Provenance(new WorkspaceUser("foo")); + // TODO CODE now it does have a hashCode, so can rework any tests relying on identity eq + private static final Provenance PROV = basicProv(new WorkspaceUser("foo")); private static final ObjectInformation INFO = new ObjectInformation( 1, "foo", "type", new Date(), 1, new WorkspaceUser("u"), new ResolvedWorkspaceID(1, "bar", false, false), "chksum", 25, null); diff --git a/src/us/kbase/workspace/test/workspace/WorkspaceTest.java b/src/us/kbase/workspace/test/workspace/WorkspaceTest.java index 5d17455c1..f7c90e0f1 100644 --- a/src/us/kbase/workspace/test/workspace/WorkspaceTest.java +++ b/src/us/kbase/workspace/test/workspace/WorkspaceTest.java @@ -8,15 +8,17 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import static us.kbase.common.test.TestCommon.inst; +import static us.kbase.common.test.TestCommon.now; +import static us.kbase.common.test.TestCommon.set; +import static us.kbase.common.test.TestCommon.list; import static us.kbase.workspace.test.LongTextForTestUsage.LONG_TEXT_PART; import static us.kbase.workspace.test.LongTextForTestUsage.LONG_TEXT; import static us.kbase.workspace.test.LongTextForTestUsage.TEXT100; import static us.kbase.workspace.test.LongTextForTestUsage.TEXT101; import static us.kbase.workspace.test.LongTextForTestUsage.TEXT256; import static us.kbase.workspace.test.LongTextForTestUsage.TEXT1000; -import static us.kbase.common.test.TestCommon.inst; -import static us.kbase.common.test.TestCommon.set; -import static us.kbase.common.test.TestCommon.list; +import static us.kbase.workspace.test.WorkspaceTestCommon.basicProv; import java.io.File; import java.io.StringReader; @@ -79,7 +81,6 @@ import us.kbase.workspace.database.ObjectIdentifier; import us.kbase.workspace.database.ObjectInformation; import us.kbase.workspace.database.Permission; -import us.kbase.workspace.database.Provenance; import us.kbase.workspace.database.Reference; import us.kbase.workspace.database.ResolvedWorkspaceID; import us.kbase.workspace.database.ResourceUsageConfigurationBuilder; @@ -101,6 +102,7 @@ import us.kbase.workspace.database.exceptions.NoSuchWorkspaceException; import us.kbase.workspace.database.exceptions.PreExistingWorkspaceException; import us.kbase.workspace.database.provenance.ExternalData; +import us.kbase.workspace.database.provenance.Provenance; import us.kbase.workspace.database.provenance.ProvenanceAction; import us.kbase.workspace.database.provenance.SubAction; import us.kbase.workspace.database.refsearch.ReferenceSearchMaximumSizeExceededException; @@ -330,7 +332,7 @@ public void adminGetObjectAndInfoStandard() throws Exception { final ObjectInformation oi = ws.saveObjects(user, wsi, Arrays.asList( new WorkspaceSaveObject( new ObjectIDNoWSNoVer("foo"), new HashMap<>(), SAFE_TYPE1, null, - new Provenance(user), false)), idfac).get(0); + basicProv(user), false)), idfac).get(0); final ObjectIdentifier oid = ObjectIdentifier.getBuilder(wsi).withID(1L).build(); final List obj = ws.getObjects( @@ -360,7 +362,7 @@ public void adminGetObjectAndInfoStandardFailDeleted() throws Exception { ws.saveObjects(user, wsi, Arrays.asList( new WorkspaceSaveObject( new ObjectIDNoWSNoVer("foo"), new HashMap<>(), SAFE_TYPE1, null, - new Provenance(user), false)), idfac).get(0); + basicProv(user), false)), idfac).get(0); final ObjectIdentifier oid = ObjectIdentifier.getBuilder(wsi).withID(1L).build(); ws.setObjectsDeleted(user, Arrays.asList(oid), true); @@ -429,11 +431,11 @@ public void adminGetObjectAndInfoPath() throws Exception { final ObjectInformation oi = ws.saveObjects(user, wsi, Arrays.asList( new WorkspaceSaveObject( new ObjectIDNoWSNoVer("foo"), new HashMap<>(), SAFE_TYPE1, null, - new Provenance(user), false)), idfac).get(0); + basicProv(user), false)), idfac).get(0); ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("foo2"), ImmutableMap.of("refs", Arrays.asList("1/1")), - REF_TYPE, null, new Provenance(user), false)), idfac).get(0); + REF_TYPE, null, basicProv(user), false)), idfac).get(0); final List objid = Arrays.asList( ObjectIdentifier.getBuilder(wsi).withID(1L).build()); @@ -468,11 +470,11 @@ public void adminGetObjectAndInfoPathFailDeleted() throws Exception { ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("foo"), new HashMap<>(), SAFE_TYPE1, null, - new Provenance(user), false)), idfac).get(0); + basicProv(user), false)), idfac).get(0); ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("foo2"), ImmutableMap.of("refs", Arrays.asList("1/1")), - REF_TYPE, null, new Provenance(user), false)), idfac).get(0); + REF_TYPE, null, basicProv(user), false)), idfac).get(0); final List objid = Arrays.asList( ObjectIdentifier.getBuilder(wsi).withID(1L).build()); @@ -510,11 +512,11 @@ public void adminGetObjectAndInfoSearch() throws Exception { final ObjectInformation oi = ws.saveObjects(user, wsi, Arrays.asList( new WorkspaceSaveObject( new ObjectIDNoWSNoVer("foo"), new HashMap<>(), SAFE_TYPE1, null, - new Provenance(user), false)), idfac).get(0); + basicProv(user), false)), idfac).get(0); ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("foo2"), ImmutableMap.of("refs", Arrays.asList("1/1")), - REF_TYPE, null, new Provenance(user), false)), idfac).get(0); + REF_TYPE, null, basicProv(user), false)), idfac).get(0); final ObjectIdentifier oi2 = ObjectIdentifier.getBuilder(wsi).withID(1L).build(); ws.setObjectsDeleted(user, Arrays.asList(oi2), true); @@ -548,11 +550,11 @@ public void adminGetObjectAndInfoSearchFailDeleted() throws Exception { ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("foo"), new HashMap<>(), SAFE_TYPE1, null, - new Provenance(user), false)), idfac).get(0); + basicProv(user), false)), idfac).get(0); ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("foo2"), ImmutableMap.of("refs", Arrays.asList("1/1")), - REF_TYPE, null, new Provenance(user), false)), idfac).get(0); + REF_TYPE, null, basicProv(user), false)), idfac).get(0); final ObjectIdentifier oi = ObjectIdentifier.getBuilder(wsi).withID(1L).build(); final ObjectIdentifier objid2 = ObjectIdentifier.getBuilder(wsi).withID(2L).build(); @@ -581,7 +583,7 @@ public void adminGetObjectHistory() throws Exception { WorkspaceIdentifier wsi = new WorkspaceIdentifier("listObjHist1"); ws.createWorkspace(user, wsi.getName(), false, null, null); - final Provenance p = new Provenance(user); + final Provenance p = basicProv(user); final ObjectInformation obj1 = saveObject(user, wsi, ImmutableMap.of("foo", "bar1"), ImmutableMap.of("foo", "bar1"), SAFE_TYPE1, "std", p); final ObjectInformation obj2 = saveObject(user, wsi, ImmutableMap.of("foo", "bar2"), @@ -630,7 +632,7 @@ public void adminListObjects() throws Exception { ws.createWorkspace(user, wsi.getName(), false, null, null); ws.createWorkspace(user, wsi2.getName(), false, null, null); - final Provenance p = new Provenance(user); + final Provenance p = basicProv(user); final ObjectInformation std1 = saveObject(user, wsi, null, ImmutableMap.of("foo", "bar"), SAFE_TYPE2, "std", p); final ObjectInformation del = saveObject(user, wsi, null, @@ -1428,8 +1430,9 @@ public void saveObjectsAndGetMetaSimple() throws Exception { Map premeta2 = new HashMap(); premeta2.put("meta2", "my hovercraft is full of eels"); WorkspaceUserMetadata meta2 = new WorkspaceUserMetadata(premeta2); - Provenance p = new Provenance(new WorkspaceUser("kbasetest2")); - p.addAction(ProvenanceAction.getBuilder().withServiceName("some service").build()); + final Provenance p = Provenance.getBuilder(new WorkspaceUser("kbasetest2"), now()) + .withAction(ProvenanceAction.getBuilder().withServiceName("some service").build()) + .build(); List objects = new ArrayList(); try { @@ -1713,8 +1716,9 @@ public void getInaccessibleObjectsAsNulls() throws Exception { Map premeta2 = new HashMap(); premeta2.put("meta2", "my hovercraft is full of eels"); WorkspaceUserMetadata meta2 = new WorkspaceUserMetadata(premeta2); - Provenance p = new Provenance(new WorkspaceUser("kbasetest2")); - p.addAction(ProvenanceAction.getBuilder().withServiceName("some service").build()); + final Provenance p = Provenance.getBuilder(new WorkspaceUser("kbasetest2"), now()) + .withAction(ProvenanceAction.getBuilder().withServiceName("some service").build()) + .build(); List objects = new ArrayList(); @@ -1820,7 +1824,7 @@ public void metadataExtracted() throws Exception { TypeDefId MyType = new TypeDefId(new TypeDefName(module, "MyType"), 0, 1); WorkspaceIdentifier wspace = new WorkspaceIdentifier("metadatatest"); ws.createWorkspace(userfoo, wspace.getName(), false, null, null); - Provenance emptyprov = new Provenance(userfoo); + Provenance emptyprov = basicProv(userfoo); // save an object and get back object info Map d1 = new LinkedHashMap(); @@ -1954,7 +1958,7 @@ public void metadataExtractedLargeTest() throws Exception { false, null); TypeDefId type = new TypeDefId( new TypeDefName(module, typeName), 0, 1); - Provenance mtprov = new Provenance(user); + Provenance mtprov = basicProv(user); WorkspaceIdentifier wsi = new WorkspaceIdentifier( "metadataExtractedLargeTest"); ws.createWorkspace(user, wsi.getName(), false, null, null); @@ -2046,7 +2050,7 @@ public void metadataSaveLargeKeyValue() throws Exception { WorkspaceUser user = new WorkspaceUser("foo"); WorkspaceIdentifier wsi = new WorkspaceIdentifier("foo"); ws.createWorkspace(user, wsi.getName(), false, null, null); - Provenance mtprov = new Provenance(user); + Provenance mtprov = basicProv(user); Map meta = new HashMap(); meta.put("a", TEXT1000.substring(101)); @@ -2066,7 +2070,7 @@ public void encodings() throws Exception { WorkspaceUser user = new WorkspaceUser("encodings"); WorkspaceIdentifier wspace = new WorkspaceIdentifier("encodings"); ws.createWorkspace(user, wspace.getName(), false, null, null); - Provenance emptyprov = new Provenance(user); + Provenance emptyprov = basicProv(user); StringBuffer sb = new StringBuffer(); sb.appendCodePoint(0x1F082); @@ -2137,7 +2141,7 @@ public void saveNonStructuralObjects() throws Exception { TypeDefId abstype5 = new TypeDefId(new TypeDefName(module, "type5"), 0, 1); WorkspaceIdentifier wspace = new WorkspaceIdentifier("nonstruct"); ws.createWorkspace(userfoo, wspace.getName(), false, null, null); - Provenance emptyprov = new Provenance(userfoo); + Provenance emptyprov = basicProv(userfoo); Map data3 = new HashMap(); data3.put("val", "2"); try { @@ -2212,7 +2216,7 @@ public void saveNulls() throws Exception { null, null, false, null); WorkspaceIdentifier wspace = new WorkspaceIdentifier("nulls"); ws.createWorkspace(userfoo, wspace.getName(), false, null, null); - Provenance emptyprov = new Provenance(userfoo); + Provenance emptyprov = basicProv(userfoo); TypeDefId abstype1 = new TypeDefId(new TypeDefName(module, "type1"), 0, 1); TypeDefId abstype2 = new TypeDefId(new TypeDefName(module, "type2"), 0, 1); TypeDefId abstype3 = new TypeDefId(new TypeDefName(module, "type3"), 0, 1); @@ -2311,7 +2315,7 @@ public void saveEmptyStringKey() throws Exception { WorkspaceIdentifier wspace = new WorkspaceIdentifier("saveEmptyStringKey"); ws.createWorkspace(user, wspace.getName(), false, null, null); - Provenance mtprov = new Provenance(user); + Provenance mtprov = basicProv(user); Map data = new HashMap(); data.put("", 3); //should work @@ -2391,7 +2395,7 @@ public void saveObjectWithTypeChecking() throws Exception { // test basic type checking with different versions WorkspaceIdentifier wspace = new WorkspaceIdentifier("typecheck"); ws.createWorkspace(userfoo, wspace.getName(), false, null, null); - Provenance emptyprov = new Provenance(userfoo); + Provenance emptyprov = basicProv(userfoo); Map data1 = new HashMap(); data1.put("foo", 3); data1.put("baz", "astring"); @@ -2599,10 +2603,10 @@ public void saveObjectWithTypeChecking() throws Exception { "Object #2, obj3 failed type checking:\nUnparseable id of type ws: IDs may not " + "be null or the empty string at /ref")); - - Provenance goodids = new Provenance(userfoo); - goodids.addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("typecheck/1/1")).build()); + final Provenance goodids = Provenance.getBuilder(userfoo, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("typecheck/1/1")).build()) + .build(); data.set(1, new WorkspaceSaveObject(obj3, data3, abstype0, null, goodids, false)); ws.saveObjects(userfoo, wspace, data, getIdFactory()); //should work @@ -2614,9 +2618,11 @@ public void saveObjectWithTypeChecking() throws Exception { "Object #1, fail has invalid reference: No read access to id " + "thereisnoworkspaceofthisname/2/1: Object 2 cannot be accessed: No " + "workspace with name thereisnoworkspaceofthisname exists at /ref")); - Provenance nowsref = new Provenance(userfoo); - nowsref.addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("thereisnoworkspaceofthisname/2/1")).build()); + final Provenance nowsref = Provenance.getBuilder(userfoo, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("thereisnoworkspaceofthisname/2/1")) + .build()) + .build(); failSave(userfoo, wspace, new ObjectIDNoWSNoVer(67), data1, abstype0, nowsref, new TypedObjectValidationException( "Object #1, 67 has invalid provenance reference: No read access to id " + @@ -2631,9 +2637,10 @@ public void saveObjectWithTypeChecking() throws Exception { "Object #1, fail has invalid reference: No read access to id " + "tobedeleted/2/1: Object 2 cannot be accessed: Workspace tobedeleted is " + "deleted at /ref")); - Provenance delwsref = new Provenance(userfoo); - delwsref.addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("tobedeleted/2/1")).build()); + final Provenance delwsref = Provenance.getBuilder(userfoo, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("tobedeleted/2/1")).build()) + .build(); failSave(userfoo, wspace, fail, data1, abstype0, delwsref, new TypedObjectValidationException( "Object #1, fail has invalid provenance reference: No read access to " + @@ -2647,9 +2654,10 @@ public void saveObjectWithTypeChecking() throws Exception { "Object #1, fail has invalid reference: No read access to id " + "stingyworkspace/2/1: Object 2 cannot be accessed: User foo may not " + "read workspace stingyworkspace at /ref")); - Provenance privwsref = new Provenance(userfoo); - privwsref.addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("stingyworkspace/2/1")).build()); + final Provenance privwsref = Provenance.getBuilder(userfoo, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("stingyworkspace/2/1")).build()) + .build(); failSave(userfoo, wspace, fail, data1, abstype0, privwsref, new TypedObjectValidationException( "Object #1, fail has invalid provenance reference: No read access to " + @@ -2666,9 +2674,10 @@ public void saveObjectWithTypeChecking() throws Exception { refdata.put("ref", "referencetesting/1/1"); ws.saveObjects(userfoo, wspace, Arrays.asList(new WorkspaceSaveObject( getRandomName(), refdata, abstype1 , null, emptyprov, false)), getIdFactory()); - Provenance goodref = new Provenance(userfoo); - goodref.addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("referencetesting/1/1")).build()); + final Provenance goodref = Provenance.getBuilder(userfoo, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("referencetesting/1/1")).build()) + .build(); ws.saveObjects(userfoo, wspace, Arrays.asList( new WorkspaceSaveObject(getRandomName(), refdata, abstype1 , null, goodref, false)), getIdFactory()); @@ -2680,9 +2689,10 @@ public void saveObjectWithTypeChecking() throws Exception { "Object #1, fail has invalid reference: There is no object with id " + "referencetesting/2/1: No object with id 2 exists in workspace %s " + "(name referencetesting) at /ref", refwsid))); - Provenance noobjref = new Provenance(userfoo); - noobjref.addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("referencetesting/2/1")).build()); + final Provenance noobjref = Provenance.getBuilder(userfoo, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("referencetesting/2/1")).build()) + .build(); failSave(userfoo, wspace, fail, data1, abstype0, noobjref, new TypedObjectValidationException(String.format( "Object #1, fail has invalid provenance reference: There is no object " + @@ -2701,9 +2711,10 @@ public void saveObjectWithTypeChecking() throws Exception { "Object #1, fail has invalid reference: There is no object with id " + "referencetesting/2/1: Object 2 (name auto2) in workspace %s " + "(name referencetesting) has been deleted at /ref", refwsid))); - Provenance delobjref = new Provenance(userfoo); - delobjref.addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("referencetesting/2/1")).build()); + final Provenance delobjref = Provenance.getBuilder(userfoo, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("referencetesting/2/1")).build()) + .build(); failSave(userfoo, wspace, fail, data1, abstype0, delobjref, new TypedObjectValidationException(String.format( "Object #1, fail has invalid provenance reference: There is no object " + @@ -2716,9 +2727,10 @@ public void saveObjectWithTypeChecking() throws Exception { "Object #1, fail has invalid reference: There is no object with id " + "referencetesting/1/2: No object with id 1 (name auto1) and version 2 " + "exists in workspace %s (name referencetesting) at /ref", refwsid))); - Provenance noverref = new Provenance(userfoo); - noverref.addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("referencetesting/1/2")).build()); + final Provenance noverref = Provenance.getBuilder(userfoo, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("referencetesting/1/2")).build()) + .build(); failSave(userfoo, wspace, fail, data1, abstype0, noverref, new TypedObjectValidationException(String.format( "Object #1, fail has invalid provenance reference: There is no object " + @@ -2858,14 +2870,16 @@ public void wsIdErrorOrder() throws Exception { ws.createWorkspace(user, wsi.getName(), false, null, null).getId(); List objs = new LinkedList(); Map d = new HashMap(); - Provenance mtprov = new Provenance(user); + Provenance mtprov = basicProv(user); objs.add(new WorkspaceSaveObject(new ObjectIDNoWSNoVer("auto1"), d, SAFE_TYPE1, null, mtprov, false)); ws.saveObjects(user, wsi, objs, getIdFactory(0)); - Provenance p = new Provenance(user).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list( - wsi.getName() + "/auto1", wsi.getName() + "/auto2")).build()); + final Provenance p = Provenance.getBuilder(user, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list( + wsi.getName() + "/auto1", wsi.getName() + "/auto2")).build()) + .build(); objs.set(0, new WorkspaceSaveObject(getRandomName(), d, SAFE_TYPE1, null, p, false)); failSave(user, wsi, objs, new TypedObjectValidationException(String.format( "Object #1, %s has invalid provenance reference: There is no object with id " + @@ -2911,7 +2925,7 @@ public void genericIdExtraction() throws Exception { // test basic type checking with different versions WorkspaceIdentifier wsi = new WorkspaceIdentifier("idextract"); ws.createWorkspace(user, wsi.getName(), false, null, null); - Provenance emptyprov = new Provenance(user); + Provenance emptyprov = basicProv(user); List data = new LinkedList(); data.add(new WorkspaceSaveObject(new ObjectIDNoWSNoVer("auto1"), new HashMap(), idtype, null, emptyprov, false)); @@ -3086,7 +3100,7 @@ public void wsIDHandling() throws Exception { // test basic type checking with different versions WorkspaceIdentifier wsi = new WorkspaceIdentifier("wsIDHandling"); ws.createWorkspace(user, wsi.getName(), false, null, null).getId(); - Provenance emptyprov = new Provenance(user); + Provenance emptyprov = basicProv(user); List objs = new LinkedList(); IdReferenceHandlerSetFactory fac = getIdFactory(3); @@ -3246,7 +3260,7 @@ public void maxIdsPerCall() throws Exception { // test basic type checking with different versions WorkspaceIdentifier wsi = new WorkspaceIdentifier("maxids"); ws.createWorkspace(user, wsi.getName(), false, null, null); - Provenance emptyprov = new Provenance(user); + Provenance emptyprov = basicProv(user); IdReferenceHandlerSetFactory fac = makeFacForMaxIDTests( Arrays.asList(idtype1, idtype2), user, 8); @@ -3273,9 +3287,10 @@ public void maxIdsPerCall() throws Exception { failSave(user, wsi, objs1, fac, new TypedObjectValidationException( "Failed type checking at object #1 - the number of unique IDs in the saved objects exceeds the maximum allowed, 7")); - Provenance p = new Provenance(user).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list( - "maxids/auto1", "maxids/auto2", "maxids/auto1")).build()); + final Provenance p = Provenance.getBuilder(user, now()) + .withAction(ProvenanceAction.getBuilder().withWorkspaceObjects(list( + "maxids/auto1", "maxids/auto2", "maxids/auto1")).build()) + .build(); fac = makeFacForMaxIDTests(Arrays.asList(idtype1, idtype2), user, 10); objs1.set(0, new WorkspaceSaveObject(getRandomName(), data1, listidtype, null, p, false)); @@ -3338,7 +3353,7 @@ public void referenceClash() throws Exception { "} CheckType;" + "};"; WorkspaceUser userfoo = new WorkspaceUser("foo"); - Provenance emptyprov = new Provenance(userfoo); + Provenance emptyprov = basicProv(userfoo); types.requestModuleRegistration(userfoo, mod); types.resolveModuleRegistration(mod, true); types.compileNewTypeSpec(userfoo, specTypeCheck1, Arrays.asList("CheckType"), null, null, false, null); @@ -3397,7 +3412,7 @@ public void saveProvenance() throws Exception { WorkspaceIdentifier provid = new WorkspaceIdentifier(wsid); Map data = new HashMap(); data.put("foo", "bar"); - Provenance emptyprov = new Provenance(foo); + Provenance emptyprov = basicProv(foo); //already tested bad references in saveObjectWithTypeChecking, won't test again here @@ -3451,28 +3466,29 @@ public void saveProvenance() throws Exception { SubAction.getBuilder().withVersion("v0.1.0").build() ); - Provenance p = new Provenance(foo); - p.addAction(ProvenanceAction.getBuilder() - .withCaller("A caller") - .withCommandLine("A command line") - .withDescription("descrip") - .withIncomingArgs(list("a", "b", "c")) - .withMethod("method") - .withMethodParameters(list((Object) data, data, data)) - .withOutgoingArgs(list("d", "e", "f")) - .withScript("script") - .withScriptVersion("2.1") - .withServiceName("service") - .withServiceVersion("3") - .withTime(inst(45)) - .withExternalData(ed) - .withCustom(custom) - .withSubActions(sa) - .withWorkspaceObjects(list("provenance/auto3", "provenance/auto1/2")) - .build()); - p.addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("provenance/auto2/1", "provenance/auto1")) - .build()); + final Provenance p = Provenance.getBuilder(foo, now()) + .withAction(ProvenanceAction.getBuilder() + .withCaller("A caller") + .withCommandLine("A command line") + .withDescription("descrip") + .withIncomingArgs(list("a", "b", "c")) + .withMethod("method") + .withMethodParameters(list((Object) data, data, data)) + .withOutgoingArgs(list("d", "e", "f")) + .withScript("script") + .withScriptVersion("2.1") + .withServiceName("service") + .withServiceVersion("3") + .withTime(inst(45)) + .withExternalData(ed) + .withCustom(custom) + .withSubActions(sa) + .withWorkspaceObjects(list("provenance/auto3", "provenance/auto1/2")) + .build()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("provenance/auto2/1", "provenance/auto1")) + .build()) + .build(); ws.saveObjects(foo, prov, Arrays.asList(new WorkspaceSaveObject( getRandomName(), data, SAFE_TYPE1, null, p, false)), @@ -3493,25 +3509,13 @@ public void saveProvenance() throws Exception { assertThat("correct exception", iae.getLocalizedMessage(), is("Neither id, provenance, data, nor type may be null")); } - try { - new Provenance(null); - } catch (NullPointerException e) { - assertThat("correct exception", e.getMessage(), is("user")); - } - try { - Provenance pv = new Provenance(foo); - pv.addAction(null); - } catch (IllegalArgumentException iae) { - assertThat("correct exception", iae.getLocalizedMessage(), - is("action cannot be null")); - } - + //Test minimal provenance - Provenance p2 = new Provenance(foo); + final Provenance p2 = basicProv(foo); ws.saveObjects(foo, prov, Arrays.asList(new WorkspaceSaveObject( getRandomName(), data, SAFE_TYPE1, null, p2, false)), getIdFactory()); - List dates = checkProvenanceCorrect( + List dates = checkProvenanceCorrect( foo, p2, pidb.withID(5L).build(), new HashMap<>()); final ObjectIdentifier prov5 = ObjectIdentifier.getBuilder(prov).withID(5L).build(); final List objects = getObjects(ws, foo, Arrays.asList(prov5)); @@ -3524,18 +3528,21 @@ public void saveProvenance() throws Exception { assertThat("Prov dates same", got2.getDate(), is(gotProv2.getDate())); // make sure passing nulls for ws obj lists doesn't kill anything - final Provenance p3 = new Provenance(foo).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(null).withCaller("c").build()); + final Provenance p3 = Provenance.getBuilder(foo, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(null).withCaller("c").build()) + .build(); ws.saveObjects(foo, prov, Arrays.asList(new WorkspaceSaveObject( getRandomName(), data, SAFE_TYPE1, null, p3, false)), getIdFactory()); checkProvenanceCorrect(foo, p3, pidb.withID(6L).build(), new HashMap<>()); - final Provenance p4 = new Provenance(foo) - .addAction(ProvenanceAction.getBuilder() + final Provenance p4 = Provenance.getBuilder(foo, now()) + .withAction(ProvenanceAction.getBuilder() .withWorkspaceObjects(null).withCaller("c").build()) - .addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(null).withServiceName("s").build()); + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(null).withServiceName("s").build()) + .build(); ws.saveObjects(foo, prov, Arrays.asList(new WorkspaceSaveObject( getRandomName(), data, SAFE_TYPE1, null, p4, false)), getIdFactory()); @@ -3553,16 +3560,18 @@ public void saveLargeProvenance() throws Exception { for (int i = 1; i < 997; i++) { methparams.add(TEXT1000); } - Provenance p = new Provenance(foo); - p.addAction(ProvenanceAction.getBuilder().withMethodParameters(methparams).build()); + final Provenance p = Provenance.getBuilder(foo, now()) + .withAction(ProvenanceAction.getBuilder().withMethodParameters(methparams).build()) + .build(); ws.saveObjects(foo, prov, Arrays.asList( //should work new WorkspaceSaveObject(getRandomName(), data, SAFE_TYPE1, null, p, false)), getIdFactory()); methparams.add(TEXT1000); - Provenance p2 = new Provenance(foo); - p2.addAction(ProvenanceAction.getBuilder().withMethodParameters(methparams).build()); + final Provenance p2 = Provenance.getBuilder(foo, now()) + .withAction(ProvenanceAction.getBuilder().withMethodParameters(methparams).build()) + .build(); try { ws.saveObjects(foo, prov, Arrays.asList( new WorkspaceSaveObject(getRandomName(), data, SAFE_TYPE1, null, p2, false)), @@ -3585,7 +3594,7 @@ public void saveWithWrongObjectId() throws Exception { try { ws.saveObjects(foo, read, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer(3), savedata, SAFE_TYPE1, null, - new Provenance(foo), false)), + basicProv(foo), false)), getIdFactory()); fail("saved object with non-existant id"); } catch (NoSuchObjectException nsoe) { @@ -3664,7 +3673,7 @@ public void saveWithReferencePaths() throws Exception { ws.createWorkspace(u2, privws.getName(), false, null, null); ws.createWorkspace(u1, testws.getName(), false, null, null); - final Provenance p2 = new Provenance(u2); + final Provenance p2 = basicProv(u2); final String leaf1Name = "leaf1"; // 2/1/1 saveObject(u2, privws, makeMeta(1), MT_MAP, type1, leaf1Name, p2); @@ -3708,8 +3717,10 @@ public void saveWithReferencePaths() throws Exception { // 2/5/1 final String refref1Name = "refref1"; // 2 hops - final Provenance p2withRef = new Provenance(u2).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list(ref1ref)).build()); + final Provenance p2withRef = Provenance.getBuilder(u2, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list(ref1ref)).build()) + .build(); saveObject(u2, privws, MT_MAP, MT_MAP, SAFE_TYPE1, refref1Name, p2withRef); final String refref1ref = privws.getName() + "/" + refref1Name + "/" + 1; @@ -3749,27 +3760,31 @@ public void saveWithReferencePaths() throws Exception { // test saving object with provenance references final WorkspaceIdentifier testwsid = new WorkspaceIdentifier(3); final ObjectIdentifier.Builder testwsidb = ObjectIdentifier.getBuilder(testwsid); - Provenance prefs = new Provenance(u1).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list( + Provenance prefs = Provenance.getBuilder(u1, now()) + .withAction(ProvenanceAction.getBuilder().withWorkspaceObjects(list( " \nreadws/4 ; 2/refref1/1;2/3 ; 2/leaf1/1; ", - "readws/readable")).build()); + "readws/readable")) + .build()) + .build(); saveObject(u1, testws, MT_MAP, MT_MAP, SAFE_TYPE1, "provtest1", prefs); checkProvenanceCorrect( u1, prefs, testwsidb.withName("provtest1").build(), trimKeys(refPaths1)); - prefs = new Provenance(u1).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list( - "1/3/1 ; \n 2/ref2/1 ; privws/1", - " readws/4 ; 2/refref1/1;2/3 ; privws/delleaf; \n ", - "1/readableRef;readws/1")).build()); + prefs = Provenance.getBuilder(u1, now()).withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list( + "1/3/1 ; \n 2/ref2/1 ; privws/1", + " readws/4 ; 2/refref1/1;2/3 ; privws/delleaf; \n ", + "1/readableRef;readws/1")) + .build()) + .build(); saveObject(u1, testws, MT_MAP, MT_MAP, SAFE_TYPE1, "provtest2", prefs); checkProvenanceCorrect( u1, prefs, testwsidb.withName("provtest2").build(), trimKeys(refPaths2)); // test fail save on bad reference // also tests failing on objects with id attributes - final Provenance p1 = new Provenance(u1); + final Provenance p1 = basicProv(u1); final ObjectIDNoWSNoVer fail = new ObjectIDNoWSNoVer("fail"); failSave(u1, testws, fail, makeRefData(" \nreadws/4 ; 2/refref1/1;2/3 ; 2/leaf1/1; ", "readws/readable", @@ -3835,11 +3850,14 @@ public void saveWithReferencePaths() throws Exception { //bad ref final Map mt = new HashMap<>(); - Provenance pfail = new Provenance(u1).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list( - " \nreadws/4 ; 2/refref1/1;2/3 ; 2/leaf1/1; ", - "readws/readable", - "1/3/1 ; \n 2/ref1/1 ; privws/1")).build()); + Provenance pfail = Provenance.getBuilder(u1, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list( + " \nreadws/4 ; 2/refref1/1;2/3 ; 2/leaf1/1; ", + "readws/readable", + "1/3/1 ; \n 2/ref1/1 ; privws/1")) + .build()) + .build(); failSave(u1, testws, fail, mt, type1Ref, pfail, new TypedObjectValidationException( "Object #1, fail has invalid provenance reference: Reference path " + @@ -3847,12 +3865,14 @@ public void saveWithReferencePaths() throws Exception { "reference to 2/ref1/1")); // inaccessible head - pfail = new Provenance(u1).addAction(ProvenanceAction.getBuilder() + pfail = Provenance.getBuilder(u1, now()).withAction(ProvenanceAction.getBuilder() .withWorkspaceObjects(list( " \nreadws/4 ; 2/refref1/1;2/3 ; 2/leaf1/1; ", "readws/readable", "1/3/1 ; \n 2/ref2/1 ; privws/1", - "1/5/1 ; 1/1/1")).build()); + "1/5/1 ; 1/1/1")) + .build()) + .build(); failSave(u1, testws, fail, mt, type1Ref, pfail, new TypedObjectValidationException( "Object #1, fail has invalid provenance reference: No read access to id " + @@ -3882,7 +3902,7 @@ private void successSaveWithRefPaths( final Map incdata = new HashMap<>(); incdata.put("refs", refs); objs.add(new WorkspaceSaveObject(getRandomName(), incdata, type1, null, - new Provenance(u1), false)); + basicProv(u1), false)); resolvedRefs.add(rrefs); } final List ois = ws.saveObjects( @@ -3920,7 +3940,7 @@ public void unserializableData() throws Exception { ws.saveObjects(foo, read, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("jframe"), data, SAFE_TYPE1, new WorkspaceUserMetadata(meta), - new Provenance(foo), false)), + basicProv(foo), false)), getIdFactory()); fail("saved unserializable object"); } catch (IllegalArgumentException iae) { @@ -3939,7 +3959,7 @@ public void getNonexistantObjects() throws Exception { JsonNode savedata = MAPPER.valueToTree(data); List objects = new ArrayList(); objects.add(new WorkspaceSaveObject(new ObjectIDNoWSNoVer("myname"), - savedata, SAFE_TYPE1, null, new Provenance(foo), false)); + savedata, SAFE_TYPE1, null, basicProv(foo), false)); ws.saveObjects(foo, read, objects, getIdFactory()); final ObjectIdentifier.Builder b = ObjectIdentifier.getBuilder(read); getNonExistantObject(foo, b.withID(2L).build(), @@ -3996,10 +4016,10 @@ public void deleteUndelete() throws Exception { data1.put("data", "1"); data2.put("data", "2"); WorkspaceSaveObject sobj1 = new WorkspaceSaveObject( - new ObjectIDNoWSNoVer("obj"), data1, SAFE_TYPE1, null, new Provenance(user), false); + new ObjectIDNoWSNoVer("obj"), data1, SAFE_TYPE1, null, basicProv(user), false); ws.saveObjects(user, read, Arrays.asList(sobj1, new WorkspaceSaveObject(new ObjectIDNoWSNoVer("obj"), data2, SAFE_TYPE1, - null, new Provenance(user), false)), getIdFactory()); + null, basicProv(user), false)), getIdFactory()); final ObjectIdentifier.Builder b = ObjectIdentifier.getBuilder(read).withName("obj"); final ObjectIdentifier o1 = b.withVersion(1).build(); final ObjectIdentifier o2 = b.withVersion(2).build(); @@ -4070,7 +4090,7 @@ public void deleteUndelete() throws Exception { //save should undelete ws.saveObjects(user, read, Arrays.asList( new WorkspaceSaveObject(new ObjectIDNoWSNoVer("obj"), data1, - SAFE_TYPE1, null, new Provenance(user), false)), getIdFactory()); + SAFE_TYPE1, null, basicProv(user), false)), getIdFactory()); idToData.put(o3, data1); objs = new ArrayList(idToData.keySet()); @@ -4372,13 +4392,13 @@ private void setUpCopyWorkspaces(WorkspaceUser user1, WorkspaceUser user2, LinkedList refobjs = new LinkedList(); for (int i = 0; i < 4; i++) { refobjs.add(new WorkspaceSaveObject(new ObjectIDNoWSNoVer("auto" + (i + 1)), - new HashMap(), SAFE_TYPE1, null, new Provenance(user1), + new HashMap(), SAFE_TYPE1, null, basicProv(user1), false)); } ws.saveObjects(user1, refs, refobjs, getIdFactory()); List wso = Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("auto2"), new HashMap(), - SAFE_TYPE1, null, new Provenance(user1), false)); + SAFE_TYPE1, null, basicProv(user1), false)); ws.saveObjects(user1, refs, wso, getIdFactory()); ws.saveObjects(user1, refs, wso, getIdFactory()); @@ -4390,7 +4410,6 @@ private void setUpCopyWorkspaces(WorkspaceUser user1, WorkspaceUser user2, Map data2 = makeRefData(refws + "/auto4"); Map data3 = makeRefData(refws + "/auto1"); - Provenance prov1 = new Provenance(user1); final ProvenanceAction.Builder pa1 = ProvenanceAction.getBuilder() .withCommandLine("A command line") .withDescription("descrip") @@ -4404,15 +4423,19 @@ private void setUpCopyWorkspaces(WorkspaceUser user1, WorkspaceUser user2, .withServiceVersion("3") .withTime(inst(45)) .withWorkspaceObjects(list(refws + "/auto3", refws + "/auto2/2")); - prov1.addAction(pa1.build()); - prov1.addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list(refws + "/auto2/1", refws + "/auto1")).build()); - Provenance prov2 = new Provenance(user1); - Provenance prov3 = new Provenance(user1); - prov2.addAction(pa1.withServiceVersion("4") - .withWorkspaceObjects(list(refws + "/auto2")).build()); - prov3.addAction(pa1.withServiceVersion("5") - .withWorkspaceObjects(list(refws + "/auto3/1")).build()); + final Provenance prov1 = Provenance.getBuilder(user1, now()) + .withAction(pa1.build()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list(refws + "/auto2/1", refws + "/auto1")).build()) + .build(); + final Provenance prov2 = Provenance.getBuilder(user1, now()) + .withAction(pa1.withServiceVersion("4") + .withWorkspaceObjects(list(refws + "/auto2")).build()) + .build(); + final Provenance prov3 = Provenance.getBuilder(user1, now()) + .withAction(pa1.withServiceVersion("5") + .withWorkspaceObjects(list(refws + "/auto3/1")).build()) + .build(); WorkspaceIdentifier cp1 = new WorkspaceIdentifier(ws1); WorkspaceIdentifier cp2 = new WorkspaceIdentifier(ws2); @@ -4703,8 +4726,8 @@ public void copyReferenceVisibility() throws Exception { ws.createWorkspace(user2, wsiCopied.getName(), false, null, null); WorkspaceIdentifier wsiCid = new WorkspaceIdentifier(3); - Provenance emptyprov1 = new Provenance(user1); - Provenance emptyprov2 = new Provenance(user2); + Provenance emptyprov1 = basicProv(user1); + Provenance emptyprov2 = basicProv(user2); List data = new LinkedList(); data.add(new WorkspaceSaveObject(getRandomName(), new HashMap(), SAFE_TYPE1, null, emptyprov1, false)); @@ -4844,7 +4867,7 @@ public void cloneWithExclude() throws Exception { WorkspaceIdentifier source = new WorkspaceIdentifier("source"); ws.createWorkspace(user, source.getName(), false, null, null).getId(); List objects = new LinkedList(); - Provenance p = new Provenance(user); + Provenance p = basicProv(user); final HashMap mt = new HashMap(); objects.add(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("object1"), mt, SAFE_TYPE1, null, p, false)); @@ -4914,7 +4937,7 @@ public void clonePreserveIDs() throws Exception { WorkspaceUser user = new WorkspaceUser("foo"); WorkspaceIdentifier source = new WorkspaceIdentifier("source"); Map mt = new HashMap(); - Provenance p = new Provenance(user); + Provenance p = basicProv(user); ws.createWorkspace(user, source.getName(), false, null, null); List objects = Arrays.asList( @@ -4977,7 +5000,7 @@ public void cloneEmpty() throws Exception { // test cloning an empty workspace WorkspaceUser user = new WorkspaceUser("foo"); WorkspaceIdentifier source = new WorkspaceIdentifier("source"); - Provenance p = new Provenance(user); + Provenance p = basicProv(user); Map mt = new HashMap(); Map meta = new HashMap(); meta.put("foo", "bar"); @@ -5022,7 +5045,7 @@ public void cloneCopySave() throws Exception { WorkspaceUser user = new WorkspaceUser("foo"); WorkspaceIdentifier source = new WorkspaceIdentifier("source"); Map mt = new HashMap(); - Provenance p = new Provenance(user); + Provenance p = basicProv(user); ws.createWorkspace(user, source.getName(), false, null, null); List objects = Arrays.asList( @@ -5207,7 +5230,7 @@ public void lockWorkspace() throws Exception { new WorkspaceUserMetadata(meta)).getId(); ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("auto1"), new HashMap(), SAFE_TYPE1, - new WorkspaceUserMetadata(), new Provenance(user), false)), getIdFactory()); + new WorkspaceUserMetadata(), basicProv(user), false)), getIdFactory()); final ObjectIdentifier oi = ObjectIdentifier.getBuilder(wsi).withName("auto1").build(); //these should work WorkspaceInformation info = ws.lockWorkspace(user, wsi); @@ -5260,7 +5283,7 @@ public void lockWorkspace() throws Exception { ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject(getRandomName(), new HashMap(), SAFE_TYPE1, new WorkspaceUserMetadata(), - new Provenance(user), false)), getIdFactory()); + basicProv(user), false)), getIdFactory()); fail("saved to locked workspace"); } catch (WorkspaceAuthorizationException e) { assertThat("correct exception", e.getLocalizedMessage(), @@ -5383,10 +5406,10 @@ public void renameObject() throws Exception { ws.createWorkspace(user2, wsi2.getName(), false, null, null); ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("auto1"), new HashMap(), SAFE_TYPE1, null, - new Provenance(user), false)), getIdFactory()); + basicProv(user), false)), getIdFactory()); ws.saveObjects(user2, wsi2, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("auto2"), new HashMap(), SAFE_TYPE1, null, - new Provenance(user), false)), getIdFactory()); + basicProv(user), false)), getIdFactory()); lastWSDate = ws.getWorkspaceInformation(user, wsi).getModDate(); final ObjectInformation info = ws.renameObject( user, wsib.withName("auto1").build(), "mynewname"); @@ -5400,7 +5423,7 @@ public void renameObject() throws Exception { ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("myoldname"), new HashMap(), SAFE_TYPE1, null, - new Provenance(user), false)), getIdFactory()); + basicProv(user), false)), getIdFactory()); final ObjectIdentifier mynew = wsib.withName("mynewname").build(); failObjRename(user, mynew, "bad%name", new IllegalArgumentException( "Illegal character in object name bad%name: %")); @@ -5548,13 +5571,13 @@ public void hiddenObjects() throws Exception { long wsid1 = ws.createWorkspace(user, wsi.getName(), false, null, null).getId(); ObjectInformation auto1 = ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("auto1"), new HashMap(), SAFE_TYPE1, null, - new Provenance(user), false)), getIdFactory()).get(0); + basicProv(user), false)), getIdFactory()).get(0); ObjectInformation auto2 = ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("auto2"), new HashMap(), SAFE_TYPE1, null, - new Provenance(user), true)), getIdFactory()).get(0); + basicProv(user), true)), getIdFactory()).get(0); ObjectInformation obj1 = ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("obj1"), new HashMap(), SAFE_TYPE1, null, - new Provenance(user), true)), getIdFactory()).get(0); + basicProv(user), true)), getIdFactory()).get(0); List expected = new ArrayList(); expected.add(auto1); @@ -5902,10 +5925,10 @@ public void listObjectsWithDeletedObjects() throws Exception { ObjectInformation std = ws.saveObjects(u1, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("std"), new HashMap(), SAFE_TYPE1, - null, new Provenance(u1), false)), getIdFactory()).get(0); + null, basicProv(u1), false)), getIdFactory()).get(0); ObjectInformation del = ws.saveObjects(u1, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("del"), new HashMap(), SAFE_TYPE1, - null, new Provenance(u1), false)), getIdFactory()).get(0); + null, basicProv(u1), false)), getIdFactory()).get(0); ws.setObjectsDeleted( u1, Arrays.asList(ObjectIdentifier.getBuilder(wsi).withName("del").build()), true); @@ -5985,13 +6008,13 @@ public void listObjectsAndHistory() throws Exception { ObjectInformation std = ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("std"), new HashMap(), SAFE_TYPE1, - null, new Provenance(user), false)), getIdFactory()).get(0); + null, basicProv(user), false)), getIdFactory()).get(0); ObjectInformation stdnometa = ws.getObjectInformation( user, Arrays.asList(wsib.withName("std").build()), false, false).get(0); ObjectInformation objstack1 = ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("objstack"), new HashMap(), SAFE_TYPE1_10, meta, - new Provenance(user), false)), getIdFactory()).get(0); + basicProv(user), false)), getIdFactory()).get(0); ObjectInformation objstack1nometa = ws.getObjectInformation( user, Arrays.asList(wsib.withName("objstack").withVersion(1).build()), @@ -6000,7 +6023,7 @@ public void listObjectsAndHistory() throws Exception { ObjectInformation objstack2 = ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("objstack"), passTCdata, SAFE_TYPE1_20, meta2, - new Provenance(user), false)), getIdFactory()).get(0); + basicProv(user), false)), getIdFactory()).get(0); ObjectInformation objstack2nometa = ws.getObjectInformation( user, Arrays.asList(wsib.withName("objstack").withVersion(2).build()), @@ -6009,7 +6032,7 @@ public void listObjectsAndHistory() throws Exception { ObjectInformation type2_1 = ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("type2"), new HashMap(), SAFE_TYPE2, meta, - new Provenance(user), false)), getIdFactory()).get(0); + basicProv(user), false)), getIdFactory()).get(0); ObjectInformation type2_1nometa = ws.getObjectInformation( user, Arrays.asList(wsib.withName("type2").withVersion(1).build()), @@ -6018,7 +6041,7 @@ public void listObjectsAndHistory() throws Exception { ObjectInformation type2_2 = ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("type2"), new HashMap(), SAFE_TYPE2_10, meta2, - new Provenance(user), false)), getIdFactory()).get(0); + basicProv(user), false)), getIdFactory()).get(0); ObjectInformation type2_2nometa = ws.getObjectInformation( user, Arrays.asList(wsib.withName("type2").withVersion(2).build()), @@ -6027,7 +6050,7 @@ public void listObjectsAndHistory() throws Exception { ObjectInformation type2_3 = ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("type2"), passTCdata, SAFE_TYPE2_20, meta32, - new Provenance(user), false)), getIdFactory()).get(0); + basicProv(user), false)), getIdFactory()).get(0); ObjectInformation type2_3nometa = ws.getObjectInformation( user, Arrays.asList(wsib.withName("type2").withVersion(3).build()), @@ -6036,7 +6059,7 @@ public void listObjectsAndHistory() throws Exception { ObjectInformation type2_4 = ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("type2"), passTCdata, SAFE_TYPE2_21, meta3, - new Provenance(user), false)), getIdFactory()).get(0); + basicProv(user), false)), getIdFactory()).get(0); ObjectInformation type2_4nometa = ws.getObjectInformation( user, Arrays.asList(wsib.withName("type2").withVersion(4).build()), @@ -6046,45 +6069,45 @@ public void listObjectsAndHistory() throws Exception { ObjectInformation stdws2 = ws.saveObjects(user2, writeable, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("stdws2"), new HashMap(), SAFE_TYPE1, meta, - new Provenance(user), false)), getIdFactory()).get(0); + basicProv(user), false)), getIdFactory()).get(0); ObjectInformation stdws2nometa = ws.getObjectInformation( user, Arrays.asList(wtb.withName("stdws2").build()), false, false).get(0); ObjectInformation hidden = ws.saveObjects(user, writeable, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("hidden"), new HashMap(), SAFE_TYPE1, meta2, - new Provenance(user), false)), getIdFactory()).get(0); + basicProv(user), false)), getIdFactory()).get(0); ObjectInformation hiddennometa = ws.getObjectInformation( user, Arrays.asList(wtb.withName("hidden").build()), false, false).get(0); ws.setObjectsHidden(user, Arrays.asList(wtb.withName("hidden").build()), true); ObjectInformation deleted = ws.saveObjects(user2, writeable, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("deleted"), new HashMap(), SAFE_TYPE1, meta32, - new Provenance(user), false)), getIdFactory()).get(0); + basicProv(user), false)), getIdFactory()).get(0); ObjectInformation deletednometa = ws.getObjectInformation( user, Arrays.asList(wtb.withName("deleted").build()), false, false).get(0); ws.setObjectsDeleted(user, Arrays.asList(wtb.withName("deleted").build()), true); ObjectInformation readobj = ws.saveObjects(user2, readable, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("readobj"), new HashMap(), SAFE_TYPE1, meta3, - new Provenance(user), false)), getIdFactory()).get(0); + basicProv(user), false)), getIdFactory()).get(0); ObjectInformation readobjnometa = ws.getObjectInformation( user, Arrays.asList(rdb.withName("readobj").build()), false, false).get(0); ObjectInformation adminobj = ws.saveObjects(user2, adminable, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("adminobj"), new HashMap(), SAFE_TYPE1, meta3, - new Provenance(user), false)), getIdFactory()).get(0); + basicProv(user), false)), getIdFactory()).get(0); ObjectInformation adminobjnometa = ws.getObjectInformation( user, Arrays.asList(adb.withName("adminobj").build()), false, false).get(0); ObjectInformation thirdobj = ws.saveObjects(user3, thirdparty, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("thirdobj"), new HashMap(), SAFE_TYPE1, meta, - new Provenance(user), false)), getIdFactory()).get(0); + basicProv(user), false)), getIdFactory()).get(0); ObjectInformation thirdobjnometa = ws.getObjectInformation( user, Arrays.asList(thrdb.withName("thirdobj").build()), false, false).get(0); //this should be invisible to anyone except user3 ws.saveObjects(user3, thirdparty, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("thirdobjdel"), new HashMap(), SAFE_TYPE1, meta, - new Provenance(user), false)), getIdFactory()).get(0); + basicProv(user), false)), getIdFactory()).get(0); ws.setObjectsDeleted(user3, Arrays.asList(thrdb.withName("thirdobjdel").build()), true); TypeDefId allType1 = new TypeDefId(SAFE_TYPE1.getType().getTypeString()); @@ -6343,7 +6366,7 @@ public void getNamesByPrefix() throws Exception { ws.createWorkspace(u, wi.getName(), false, null, null); } Map mt = new HashMap(); - Provenance p = new Provenance(u); + Provenance p = basicProv(u); ws.setGlobalPermission(u, wsiGR, Permission.READ); ws.saveObjects(u, wsi1, Arrays.asList( @@ -6432,7 +6455,7 @@ public void getNameByPrefixRegex() throws Exception { WorkspaceIdentifier wsi = new WorkspaceIdentifier("getNamesByPrefix1"); ws.createWorkspace(u, wsi.getName(), false, null, null); Map mt = new HashMap(); - Provenance p = new Provenance(u); + Provenance p = basicProv(u); List mtlist = new LinkedList(); ws.saveObjects(u, wsi, Arrays.asList( @@ -6472,7 +6495,7 @@ public void getNamesByPrefixLimit() throws Exception { ws.createWorkspace(u, wi.getName(), false, null, null); } Map mt = new HashMap(); - Provenance p = new Provenance(u); + Provenance p = basicProv(u); ws.saveObjects(u, wsi1, Arrays.asList( new WorkspaceSaveObject(new ObjectIDNoWSNoVer("aaa"), mt, @@ -6583,7 +6606,7 @@ public void listObjectsByDate() throws Exception { WorkspaceIdentifier wsi = new WorkspaceIdentifier("listObjsByDateWS"); ws.createWorkspace(u, wsi.getName(), false, null, null); Map data = new HashMap(); - Provenance p = new Provenance(u); + Provenance p = basicProv(u); ObjectInformation o1 = saveObject(u, wsi, null, data, SAFE_TYPE1, "o1", p); Thread.sleep(100); ObjectInformation o2 = saveObject(u, wsi, null, data, SAFE_TYPE1, "o2", p); @@ -6636,7 +6659,7 @@ public void listObjectsLimit() throws Exception { List objs = new LinkedList(); for (int i = 0; i < 200; i++) { objs.add(new WorkspaceSaveObject(getRandomName(), new HashMap(), - SAFE_TYPE1, null, new Provenance(user), false)); + SAFE_TYPE1, null, basicProv(user), false)); } ws.saveObjects(user, wsi1, objs, getIdFactory(0)); @@ -6654,7 +6677,7 @@ public void listObjectsLimit() throws Exception { meta.put("num", "" + (i/10 + 1)); objs.add(new WorkspaceSaveObject(new ObjectIDNoWSNoVer(i), new HashMap(), SAFE_TYPE1, - new WorkspaceUserMetadata(meta), new Provenance(user), + new WorkspaceUserMetadata(meta), basicProv(user), false)); } ws.saveObjects(user, wsi1, objs, getIdFactory(0)); @@ -6671,7 +6694,7 @@ public void listObjectsLimit() throws Exception { objs.clear(); for (int i = 0; i < 20; i++) { objs.add(new WorkspaceSaveObject(getRandomName(), new HashMap(), - SAFE_TYPE1, null, new Provenance(user), false)); + SAFE_TYPE1, null, basicProv(user), false)); } ws.saveObjects(user, wsi2, objs, getIdFactory(0)); @@ -6689,7 +6712,7 @@ public void listObjectsLimit() throws Exception { objs.clear(); for (int i = 21; i < 31; i++) { objs.add(new WorkspaceSaveObject(getRandomName(), new HashMap(), - SAFE_TYPE1, null, new Provenance(user), false)); + SAFE_TYPE1, null, basicProv(user), false)); } ws.saveObjects(user, wsi2, objs, getIdFactory(0)); @@ -6711,7 +6734,7 @@ public void listObjectsLimit() throws Exception { objs.clear(); for (int i = 1; i < 251; i++) { objs.add(new WorkspaceSaveObject(getRandomName(), new HashMap(), - SAFE_TYPE1, null, new Provenance(user), false)); + SAFE_TYPE1, null, basicProv(user), false)); } ws.saveObjects(user, wsi3, objs, getIdFactory(0)); @@ -6727,7 +6750,7 @@ public void listObjectsLimit() throws Exception { objs.clear(); for (int i = 251; i < 301; i++) { objs.add(new WorkspaceSaveObject(getRandomName(), new HashMap(), - SAFE_TYPE1, null, new Provenance(user), false)); + SAFE_TYPE1, null, basicProv(user), false)); } ws.saveObjects(user, wsi3, objs, getIdFactory(0)); @@ -6759,7 +6782,7 @@ public void listObjectsFilterByObjectID() throws Exception { List objs = new LinkedList(); for (int i = 0; i < 10; i++) { objs.add(new WorkspaceSaveObject(getRandomName(), new HashMap(), - SAFE_TYPE1, null, new Provenance(user), false)); + SAFE_TYPE1, null, basicProv(user), false)); } ws.saveObjects(user, wsi1, objs, getIdFactory(0)); ws.saveObjects(user, wsi2, objs, getIdFactory(0)); @@ -6809,7 +6832,7 @@ public void listObjectsSort() throws Exception { ws.createWorkspace(user, wsi1.getName(), false, null, null).getId(); WorkspaceIdentifier wsi2 = new WorkspaceIdentifier("listsort2"); ws.createWorkspace(user, wsi2.getName(), false, null, null).getId(); - final Provenance p = new Provenance(user); + final Provenance p = basicProv(user); final Map meta = ImmutableMap.of("foo", "bar"); // save 6 objects @@ -6918,12 +6941,14 @@ public void getObjectSubdata() throws Exception { WorkspaceUserMetadata meta = new WorkspaceUserMetadata(pmeta); WorkspaceUserMetadata meta2 = new WorkspaceUserMetadata(pmeta2); - Provenance p1 = new Provenance(user); - p1.addAction(ProvenanceAction.getBuilder().withDescription("provenance 1") - .withWorkspaceObjects(list("subData/auto1")).build()); - Provenance p2 = new Provenance(user); - p2.addAction(ProvenanceAction.getBuilder().withDescription("provenance 2") - .withWorkspaceObjects(list("subData/auto2")).build()); + final Provenance p1 = Provenance.getBuilder(user, now()) + .withAction(ProvenanceAction.getBuilder().withDescription("provenance 1") + .withWorkspaceObjects(list("subData/auto1")).build()) + .build(); + final Provenance p2 = Provenance.getBuilder(user, now()) + .withAction(ProvenanceAction.getBuilder().withDescription("provenance 2") + .withWorkspaceObjects(list("subData/auto2")).build()) + .build(); Map data1 = createData( "{\"map\": {\"id1\": {\"id\": 1," + @@ -6964,9 +6989,9 @@ public void getObjectSubdata() throws Exception { ws.saveObjects(user, wsi, Arrays.asList( new WorkspaceSaveObject(new ObjectIDNoWSNoVer("auto1"), data1, SAFE_TYPE1, - meta, new Provenance(user), false), + meta, basicProv(user), false), new WorkspaceSaveObject(new ObjectIDNoWSNoVer("auto2"), data1, SAFE_TYPE1, - meta, new Provenance(user), false)), + meta, basicProv(user), false)), getIdFactory()); ObjectInformation o1 = ws.saveObjects(user, wsi, Arrays.asList(new WorkspaceSaveObject( new ObjectIDNoWSNoVer("o1"), data1, reftype, meta, @@ -7132,7 +7157,7 @@ public void getReferencingObjects() throws Exception { Map mtdata = new HashMap(); - Provenance p1 = new Provenance(user1); + Provenance p1 = basicProv(user1); //test objects with no references or no accessible references ws.saveObjects(user1, wsitar1, Arrays.asList( @@ -7162,17 +7187,23 @@ public void getReferencingObjects() throws Exception { ws.saveObjects(user1, wsisrc1, list( new WorkspaceSaveObject(new ObjectIDNoWSNoVer("deletedprovrefptr"), mtdata, SAFE_TYPE1, null, - new Provenance(user1).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("refstarget1/deletedprovref")).build()), + Provenance.getBuilder(user1, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("refstarget1/deletedprovref")) + .build()) + .build(), false)), getIdFactory()); ws.setObjectsDeleted( user1, list(src1.withName("deletedprovrefptr").build()), true); ws.saveObjects(user2, wsisrc2noaccess, list( new WorkspaceSaveObject(new ObjectIDNoWSNoVer("unreadableprovrefptr"), mtdata, SAFE_TYPE1, null, - new Provenance(user1).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("refstarget1/unreadableprovref")) - .build()), + Provenance.getBuilder(user1, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list( + "refstarget1/unreadableprovref")) + .build()) + .build(), false)), getIdFactory()); List> mtrefs = new ArrayList>(); @@ -7203,47 +7234,53 @@ user1, list(tar1.withName(name).build())), ObjectInformation stdref1 = ws.saveObjects(user1, wsisrc1, list( new WorkspaceSaveObject(new ObjectIDNoWSNoVer("stdref"), refdata, reftype, meta1, - new Provenance(user1).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("refstarget1/stk/1")).build()), false)), + Provenance.getBuilder(user1, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("refstarget1/stk/1")).build()) + .build(), + false)), getIdFactory()).get(0); refdata.put("refs", list("refstarget1/stk/2")); ObjectInformation stdref2 = ws.saveObjects(user1, wsisrc1, list( new WorkspaceSaveObject(new ObjectIDNoWSNoVer("stdref"), refdata, - reftype, meta2, new Provenance(user1), false)), + reftype, meta2, basicProv(user1), false)), getIdFactory()).get(0); refdata.put("refs", list("refstarget1/stk")); ObjectInformation hiddenref = ws.saveObjects(user1, wsisrc1, list( new WorkspaceSaveObject(new ObjectIDNoWSNoVer("hiddenref"), refdata, - reftype, meta1, new Provenance(user1), true)), + reftype, meta1, basicProv(user1), true)), getIdFactory()).get(0); refdata.put("refs", list("refstarget2/stk2")); @SuppressWarnings("unused") ObjectInformation delref = ws.saveObjects(user1, wsisrc1, list( new WorkspaceSaveObject(new ObjectIDNoWSNoVer("delref"), refdata, reftype, meta1, - new Provenance(user1).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("refstarget1/stk/2")).build()), true)), + Provenance.getBuilder(user1, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("refstarget1/stk/2")).build()) + .build(), + true)), getIdFactory()).get(0); ws.setObjectsDeleted(user1, list(src1.withName("delref").build()), true); refdata.put("refs", list("refstarget1/single")); ObjectInformation readable = ws.saveObjects(user2, wsisrc2, list( new WorkspaceSaveObject(new ObjectIDNoWSNoVer("readable"), refdata, - reftype, meta2, new Provenance(user2), true)), + reftype, meta2, basicProv(user2), true)), getIdFactory()).get(0); refdata.put("refs", list("refstarget2/stk2/2")); @SuppressWarnings("unused") ObjectInformation unreadable = ws.saveObjects(user2, wsisrc2noaccess, list( new WorkspaceSaveObject(new ObjectIDNoWSNoVer("unreadable"), refdata, - reftype, meta1, new Provenance(user2), true)), + reftype, meta1, basicProv(user2), true)), getIdFactory()).get(0); refdata.put("refs", list("refstarget2/single2/1")); @SuppressWarnings("unused") ObjectInformation wsdeletedreadable1 = ws.saveObjects(user1, wsisrcdel1, list( new WorkspaceSaveObject(new ObjectIDNoWSNoVer("wsdeletedreadable1"), refdata, - reftype, meta2, new Provenance(user1), false)), + reftype, meta2, basicProv(user1), false)), getIdFactory()).get(0); ws.setWorkspaceDeleted(user1, wsisrcdel1, true); @@ -7254,8 +7291,11 @@ reftype, meta2, new Provenance(user1), false)), refdata, reftype, meta1, - new Provenance(user2).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("refstarget1/single/1")).build()), + Provenance.getBuilder(user2, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("refstarget1/single/1")) + .build()) + .build(), false)), getIdFactory()).get(0); @@ -7314,8 +7354,11 @@ reftype, meta2, new Provenance(user1), false)), ObjectInformation pstdref1 = ws.saveObjects(user1, wsisrc1, list( new WorkspaceSaveObject(new ObjectIDNoWSNoVer("pstdref"), mtdata, SAFE_TYPE1, meta1, - new Provenance(user1).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("refstarget1/stk/1")).build()), false)), + Provenance.getBuilder(user1, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("refstarget1/stk/1")).build()) + .build(), + false)), getIdFactory()).get(0); ObjectInformation pstdref2 = ws.saveObjects(user1, wsisrc1, list( new WorkspaceSaveObject( @@ -7323,8 +7366,10 @@ reftype, meta2, new Provenance(user1), false)), mtdata, SAFE_TYPE1, meta2, - new Provenance(user1).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("refstarget1/stk/2")).build()), + Provenance.getBuilder(user1, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("refstarget1/stk/2")).build()) + .build(), false)), getIdFactory()).get(0); ObjectInformation phiddenref = ws.saveObjects(user1, wsisrc1, list( @@ -7333,16 +7378,21 @@ reftype, meta2, new Provenance(user1), false)), mtdata, SAFE_TYPE1, meta1, - new Provenance(user1).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("refstarget1/stk")).build()), + Provenance.getBuilder(user1, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("refstarget1/stk")).build()) + .build(), true)), getIdFactory()).get(0); @SuppressWarnings("unused") ObjectInformation pdelref = ws.saveObjects(user1, wsisrc1, list( new WorkspaceSaveObject(new ObjectIDNoWSNoVer("pdelref"), mtdata, SAFE_TYPE1, meta1, - new Provenance(user1).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("refstarget2/stk2")).build()), true)), + Provenance.getBuilder(user1, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("refstarget2/stk2")).build()) + .build(), + true)), getIdFactory()).get(0); ws.setObjectsDeleted(user1, list(src1.withName("pdelref").build()), true); @@ -7352,8 +7402,10 @@ reftype, meta2, new Provenance(user1), false)), mtdata, SAFE_TYPE1, meta2, - new Provenance(user2).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("refstarget1/single")).build()), + Provenance.getBuilder(user2, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("refstarget1/single")).build()) + .build(), true)), getIdFactory()).get(0); @@ -7364,8 +7416,10 @@ reftype, meta2, new Provenance(user1), false)), mtdata, SAFE_TYPE1, meta1, - new Provenance(user2).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("refstarget2/stk2/2")).build()), + Provenance.getBuilder(user2, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("refstarget2/stk2/2")).build()) + .build(), true)), getIdFactory()).get(0); @@ -7377,8 +7431,11 @@ reftype, meta2, new Provenance(user1), false)), mtdata, SAFE_TYPE1, meta2, - new Provenance(user1).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("refstarget2/single2/1")).build()), + Provenance.getBuilder(user1, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("refstarget2/single2/1")) + .build()) + .build(), false)), getIdFactory()).get(0); ws.setWorkspaceDeleted(user1, wsisrcdel1, true); @@ -7389,8 +7446,10 @@ reftype, meta2, new Provenance(user1), false)), mtdata, SAFE_TYPE1, meta1, - new Provenance(user2).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list("refstarget2/stk2/1")).build()), + Provenance.getBuilder(user2, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list("refstarget2/stk2/1")).build()) + .build(), false)), getIdFactory()).get(0); @@ -7578,14 +7637,16 @@ public void getObjectsMixedCalls() throws Exception { " }" + "}"); - Provenance pU2_1 = new Provenance(user2); - pU2_1.addAction(ProvenanceAction.getBuilder().withCaller("random data").build()); + final Provenance pU2_1 = Provenance.getBuilder(user2, now()) + .withAction(ProvenanceAction.getBuilder().withCaller("random data").build()) + .build(); - Provenance pU1_1 = new Provenance(user2); - pU1_1.addAction(ProvenanceAction.getBuilder().withMethod("method").build()); + final Provenance pU1_1 = Provenance.getBuilder(user2, now()) + .withAction(ProvenanceAction.getBuilder().withMethod("method").build()).build(); - Provenance pU2_2 = new Provenance(user2); - pU2_2.addAction(ProvenanceAction.getBuilder().withDescription("a desc").build()); + final Provenance pU2_2 = Provenance.getBuilder(user2, now()) + .withAction(ProvenanceAction.getBuilder().withDescription("a desc").build()) + .build(); Map meta1 = new HashMap(); meta1.put("some", "very special metadata"); @@ -7703,7 +7764,7 @@ public void getReferencedObjectsBySearch() throws Exception { final TypeDefId reftype = new TypeDefId(new TypeDefName("CopyRev", "RefType"), 1, 0); - final Provenance p2 = new Provenance(user2); + final Provenance p2 = basicProv(user2); final String leaf1Name = "leaf1"; final ObjectInformation leaf1_1 = saveObject(user2, wsUser2, makeMeta(1), MT_MAP, SAFE_TYPE1, leaf1Name, p2); @@ -7742,8 +7803,10 @@ public void getReferencedObjectsBySearch() throws Exception { /* LEVEL 2 REFS */ final String refref1Name = "refref1"; // 2 hops - final Provenance p2withRef = new Provenance(user2).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list(ref1ref)).build()); + final Provenance p2withRef = Provenance.getBuilder(user2, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list(ref1ref)).build()) + .build(); saveObject(user2, wsUser2, MT_MAP, MT_MAP, SAFE_TYPE1, refref1Name, p2withRef); final String refref1ref = wsUser2.getName() + "/" + refref1Name + "/" + 1; @@ -7994,11 +8057,11 @@ public void searchOnReadableDeletedObject() throws Exception { ws.createWorkspace(user, wsi.getName(), false, null, null); final Map meta = ImmutableMap.of("foo", "bar"); - saveObject(user, wsi, meta, meta, SAFE_TYPE1, "leaf", new Provenance(user)); + saveObject(user, wsi, meta, meta, SAFE_TYPE1, "leaf", basicProv(user)); final ObjectIdentifier.Builder leaf = ObjectIdentifier.getBuilder(wsi).withName("leaf"); final Map data = ImmutableMap.of("refs", Arrays.asList("wsi/leaf")); - saveObject(user, wsi, meta, data, REF_TYPE, "ref", new Provenance(user)); + saveObject(user, wsi, meta, data, REF_TYPE, "ref", basicProv(user)); ws.setObjectsDeleted(user, Arrays.asList(leaf.build()), true); @@ -8019,7 +8082,7 @@ public void searchOnReadableObject() throws Exception { ws.createWorkspace(user, wsi.getName(), false, null, null); final Map meta = ImmutableMap.of("foo", "bar"); - saveObject(user, wsi, meta, meta, SAFE_TYPE1, "leaf", new Provenance(user)); + saveObject(user, wsi, meta, meta, SAFE_TYPE1, "leaf", basicProv(user)); final ObjectIdentifier oidrefs = ObjectIdentifier.getBuilder(wsi) .withName("leaf").withLookupRequired(true).build(); @@ -8079,8 +8142,8 @@ public void getReferencedObjectsByPath() throws Exception { " \"thing4\": \"aroooga\"}"); // save objects and basic accessibility checks - ObjectInformation leaf1_1 = saveObject(user2, wsiun1, meta1, data1, SAFE_TYPE1, "leaf1", new Provenance(user2)); - ObjectInformation leaf1_2 = saveObject(user2, wsiun1, meta1, data1, SAFE_TYPE1, "leaf1", new Provenance(user2)); + ObjectInformation leaf1_1 = saveObject(user2, wsiun1, meta1, data1, SAFE_TYPE1, "leaf1", basicProv(user2)); + ObjectInformation leaf1_2 = saveObject(user2, wsiun1, meta1, data1, SAFE_TYPE1, "leaf1", basicProv(user2)); final ObjectIdentifier leaf1oi1 = un1b.withID(1L).withVersion(1).build(); final ObjectIdentifier leaf1oi2 = un1b.withID(1L).withVersion(2).build(); failGetObjects(user1, list(un1nb.withName("leaf1").build()), @@ -8088,14 +8151,14 @@ public void getReferencedObjectsByPath() throws Exception { "refedUser may not read workspace refedunacc", null)); failGetObjects(user1, list(leaf1oi1), new InaccessibleObjectException( "Object 1 cannot be accessed: User refedUser may not read workspace 3", null)); - ObjectInformation leaf2 = saveObject(user2, wsiun2, meta2, data2, SAFE_TYPE1, "leaf2", new Provenance(user2)); + ObjectInformation leaf2 = saveObject(user2, wsiun2, meta2, data2, SAFE_TYPE1, "leaf2", basicProv(user2)); final ObjectIdentifier leaf2oi = un2b.withID(1L).withVersion(1).build(); failGetObjects(user1, list(un2nb.withName("leaf2").withVersion(null).build()), new InaccessibleObjectException("Object leaf2 cannot be accessed: User " + "refedUser may not read workspace refedunacc2", null)); failGetObjects(user1, list(leaf2oi), new InaccessibleObjectException( "Object 1 cannot be accessed: User refedUser may not read workspace 4", null)); - saveObject(user2, wsiun2, meta2, data2, SAFE_TYPE1, "unlinked", new Provenance(user2)); + saveObject(user2, wsiun2, meta2, data2, SAFE_TYPE1, "unlinked", basicProv(user2)); final ObjectIdentifier unlinkedoi = un2b.withID(2L).withVersion(1).build(); failGetObjects(user1, list(un2nb.withName("unlinked").withVersion(null).build()), new InaccessibleObjectException("Object unlinked cannot be accessed: User " + @@ -8105,13 +8168,13 @@ public void getReferencedObjectsByPath() throws Exception { final String leaf1r1 = "refedunacc/leaf1/1"; saveObject(user2, wsiacc1, MT_MAP, makeRefData(leaf1r1),reftype, - "simpleref", new Provenance(user2)); + "simpleref", basicProv(user2)); final String leaf1r2 = "refedunacc/leaf1/2"; saveObject(user2, wsiacc1, MT_MAP, makeRefData(leaf1r2),reftype, - "simpleref", new Provenance(user2)); + "simpleref", basicProv(user2)); final String leaf2r = "refedunacc2/leaf2"; saveObject(user2, wsiacc2, MT_MAP, makeRefData(leaf2r),reftype, - "simpleref2", new Provenance(user2)); + "simpleref2", basicProv(user2)); /* * At this point: @@ -8132,12 +8195,28 @@ public void getReferencedObjectsByPath() throws Exception { * provref2 (2) v1 -> wsiun2/leaf2 v1 */ - saveObject(user2, wsiacc1, MT_MAP, mtdata, SAFE_TYPE1, "provref", new Provenance(user2) - .addAction(ProvenanceAction.getBuilder().withWorkspaceObjects(list(leaf1r1)) - .build())); - saveObject(user2, wsiacc2, MT_MAP, mtdata, SAFE_TYPE1, "provref2", new Provenance(user2) - .addAction(ProvenanceAction.getBuilder().withWorkspaceObjects(list(leaf2r)) - .build())); + saveObject( + user2, + wsiacc1, + MT_MAP, + mtdata, + SAFE_TYPE1, + "provref", + Provenance.getBuilder(user2, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list(leaf1r1)).build()) + .build()); + saveObject( + user2, + wsiacc2, + MT_MAP, + mtdata, + SAFE_TYPE1, + "provref2", + Provenance.getBuilder(user2, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list(leaf2r)).build()) + .build()); // check one hop reference dive works final HashMap mtmap = new HashMap(); @@ -8152,27 +8231,27 @@ public void getReferencedObjectsByPath() throws Exception { final Reference pr2 = new Reference(2, 2, 1); checkReferencedObject(user1, ac1b.withName("simpleref").withVersion(1) .withReferencePath(list(leaf1oi1)).build(), - leaf1_1.updateReferencePath(list(sr11, l11)), new Provenance(user2), + leaf1_1.updateReferencePath(list(sr11, l11)), basicProv(user2), data1, mtlist, mtmap); checkReferencedObject(user1, ac1nb.withName("simpleref").withVersion(2) .withReferencePath(list(leaf1oi2)).build(), - leaf1_2.updateReferencePath(list(sr12, l12)), new Provenance(user2), + leaf1_2.updateReferencePath(list(sr12, l12)), basicProv(user2), data1, mtlist, mtmap); checkReferencedObject(user1, ac1b.withID(1L).withVersion(null) .withReferencePath(list(leaf1oi2)).build(), - leaf1_2.updateReferencePath(list(sr12, l12)), new Provenance(user2), + leaf1_2.updateReferencePath(list(sr12, l12)), basicProv(user2), data1, mtlist, mtmap); checkReferencedObject(user1, ac2b.withName("simpleref2") .withReferencePath(list(leaf2oi)).build(), - leaf2.updateReferencePath(list(sr2, l2)), new Provenance(user2), + leaf2.updateReferencePath(list(sr2, l2)), basicProv(user2), data2, mtlist, mtmap); checkReferencedObject(user1, ac1b.withName("provref") .withReferencePath(list(leaf1oi1)).build(), - leaf1_1.updateReferencePath(list(pr1, l11)), new Provenance(user2), + leaf1_1.updateReferencePath(list(pr1, l11)), basicProv(user2), data1, mtlist, mtmap); checkReferencedObject(user1, ac2b.withName("provref2") .withReferencePath(list(leaf2oi)).build(), - leaf2.updateReferencePath(list(pr2, l2)), new Provenance(user2), + leaf2.updateReferencePath(list(pr2, l2)), basicProv(user2), data2, mtlist, mtmap); //fail on one hop bad Reference paths @@ -8206,16 +8285,18 @@ public void getReferencedObjectsByPath() throws Exception { final String deleted1 = "del1"; final String deleted2 = "del2"; final ObjectInformation del1 = saveObject(user2, wsiun1, meta2, - makeRefData(leaf1r1, leaf2r), reftype, deleted1, new Provenance(user2)); + makeRefData(leaf1r1, leaf2r), reftype, deleted1, basicProv(user2)); final ObjectIdentifier del1oi = un1b.withID(2L).withVersion(1).build(); final Reference del1ref = new Reference(3, 2, 1); - final Provenance p = new Provenance(user2).addAction(ProvenanceAction.getBuilder() - .withWorkspaceObjects(list(leaf1r1, leaf2r)).build()); + final Provenance p = Provenance.getBuilder(user2, now()) + .withAction(ProvenanceAction.getBuilder() + .withWorkspaceObjects(list(leaf1r1, leaf2r)).build()) + .build(); final ObjectInformation del2 = saveObject(user2, wsiun2, meta1, makeRefData(), reftype, deleted2, p); final ObjectIdentifier del2oi = un2b.withID(3L).withVersion(1).build(); final Reference del2ref = new Reference(4, 3, 1); - saveObject(user2, wsidel, meta1, makeRefData(leaf2r), reftype, "delws", new Provenance(user2)); + saveObject(user2, wsidel, meta1, makeRefData(leaf2r), reftype, "delws", basicProv(user2)); final ObjectIdentifier delwsoi = ObjectIdentifier.getBuilder(wsidel) .withID(1L).withVersion(1).build(); final Reference delwsref = new Reference(5, 1, 1); @@ -8224,16 +8305,16 @@ public void getReferencedObjectsByPath() throws Exception { final String delpointer2 = "delptr2"; final String deppointerWorkspace = "delptrws"; saveObject(user2, wsiacc1, MT_MAP, makeRefData("refedunacc/del1", "refedunacc2/del2"), - reftype, delpointer12, new Provenance(user2)); + reftype, delpointer12, basicProv(user2)); final ObjectIdentifier.Builder delptr12b = ObjectIdentifier.getBuilder(wsiacc1) .withID(3L); final Reference dp12 = new Reference(1, 3, 1); saveObject(user2, wsiacc2, MT_MAP, makeRefData("refedunacc2/del2"), - reftype, delpointer2, new Provenance(user2)); + reftype, delpointer2, basicProv(user2)); final ObjectIdentifier.Builder delptr2b = ObjectIdentifier.getBuilder(wsiacc2).withID(3L); final Reference dp2 = new Reference(2, 3, 1); saveObject(user2, wsiacc2, MT_MAP, makeRefData("refeddel/delws"), - reftype, deppointerWorkspace, new Provenance(user2)); + reftype, deppointerWorkspace, basicProv(user2)); final Reference dpws = new Reference(2, 4, 1); ws.setObjectsDeleted(user2, list(del1oi, del2oi), true); ws.setWorkspaceDeleted(user2, wsidel, true); @@ -8289,25 +8370,25 @@ public void getReferencedObjectsByPath() throws Exception { assertThat("correct list size", lwod.size(), is(7)); compareObjectAndInfo(lwod.get(0), leaf1_1.updateReferencePath(list(dp12, del1ref, l11)), - new Provenance(user2), data1, mtlist, mtmap); + basicProv(user2), data1, mtlist, mtmap); compareObjectAndInfo(lwod.get(1), leaf2.updateReferencePath(list(dp12, del1ref, l2)), - new Provenance(user2), data2, mtlist, mtmap); + basicProv(user2), data2, mtlist, mtmap); compareObjectAndInfo(lwod.get(2), leaf1_1.updateReferencePath(list(dp12, del2ref, l11)), - new Provenance(user2), data1, mtlist, mtmap); + basicProv(user2), data1, mtlist, mtmap); compareObjectAndInfo(lwod.get(3), leaf2.updateReferencePath(list(dpws, delwsref, l2)), - new Provenance(user2), data2, mtlist, mtmap); + basicProv(user2), data2, mtlist, mtmap); compareObjectAndInfo(lwod.get(4), leaf2.updateReferencePath(list(dp12, del2ref, l2)), - new Provenance(user2), data2, mtlist, mtmap); + basicProv(user2), data2, mtlist, mtmap); compareObjectAndInfo(lwod.get(5), leaf1_1.updateReferencePath(list(dp2, del2ref, l11)), - new Provenance(user2), data1, mtlist, mtmap); + basicProv(user2), data1, mtlist, mtmap); compareObjectAndInfo(lwod.get(6), leaf2.updateReferencePath(list(dp2, del2ref, l2)), - new Provenance(user2), data2, mtlist, mtmap); + basicProv(user2), data2, mtlist, mtmap); } finally { destroyGetObjectsResources(lwod); } @@ -8322,7 +8403,7 @@ public void getReferencedObjectsByPath() throws Exception { leaf2.updateReferencePath(list(dp2, del2ref, l2))))); checkReferencedObject(user1, delptr12b.withReferencePath(list(del1oi)).build(), - del1.updateReferencePath(list(dp12, del1ref)), new Provenance(user2), + del1.updateReferencePath(list(dp12, del1ref)), basicProv(user2), makeRefData(wsidun1 + "/1/1", wsidun2 + "/1/1"), list(wsidun1 + "/1/1", wsidun2 + "/1/1"), mtmap); Map provmap = new HashMap<>(); @@ -8345,13 +8426,13 @@ public void getReferencedObjectsByPath() throws Exception { try { compareObjectAndInfo(lwod.get(0), leaf2.updateReferencePath(list(dp12, del1ref, l2)), - new Provenance(user2), data2, mtlist, mtmap); + basicProv(user2), data2, mtlist, mtmap); compareObjectAndInfo(lwod.get(1), leaf2.updateReferencePath(list(dp12, del1ref, l2)), - new Provenance(user2), data2, mtlist, mtmap); + basicProv(user2), data2, mtlist, mtmap); compareObjectAndInfo(lwod.get(2), leaf2.updateReferencePath(list(dp12, del2ref, l2)), - new Provenance(user2), data2, mtlist, mtmap); + basicProv(user2), data2, mtlist, mtmap); } finally { destroyGetObjectsResources(lwod); } @@ -8607,7 +8688,7 @@ public void sortForMD5() throws Exception { assertThat("md5 correct", md5, is("f906e268b16cbfa1c302c6bb51a6b784")); JsonNode savedata = MAPPER.valueToTree(data); - Provenance p = new Provenance(new WorkspaceUser("kbasetest2")); + Provenance p = basicProv(new WorkspaceUser("kbasetest2")); List objects = Arrays.asList(new WorkspaceSaveObject( getRandomName(), savedata, SAFE_TYPE1, null, p, false)); List objinfo = ws.saveObjects(user, wsi, objects, @@ -8631,11 +8712,11 @@ public void maxObjectSize() throws Exception { ResourceUsageConfigurationBuilder build = new ResourceUsageConfigurationBuilder(oldcfg); ws.setResourceConfig(build.withMaxObjectSize(20).build()); - saveObject(user, wsi, null, data, SAFE_TYPE1, "foo", new Provenance(user)); //should work + saveObject(user, wsi, null, data, SAFE_TYPE1, "foo", basicProv(user)); //should work data.put("foo", "90123456789"); failSave(user, wsi, Arrays.asList( new WorkspaceSaveObject(getRandomName(), data, SAFE_TYPE1, null, - new Provenance(user), false)), new IllegalArgumentException(String.format( + basicProv(user), false)), new IllegalArgumentException(String.format( "Object #1, %s data size 21 exceeds limit of 20", getLastRandomName()))); ws.setResourceConfig(oldcfg); } @@ -8653,19 +8734,19 @@ public void maxReturnedObjectSize() throws Exception { data.put("fo", "90"); data.put("ba", "3"); saveObject(user, wsi, null, data, SAFE_TYPE1, - "foo", new Provenance(user)); + "foo", basicProv(user)); final ObjectIdentifier.Builder oi1b = ObjectIdentifier.getBuilder(wsi).withID(1L) .withVersion(1); - saveObject(user, wsi, null, data, SAFE_TYPE1, "foo2", new Provenance(user)); + saveObject(user, wsi, null, data, SAFE_TYPE1, "foo2", basicProv(user)); final ObjectIdentifier.Builder oi2b = ObjectIdentifier.getBuilder(wsi).withID(2L) .withVersion(1); List oi1l = list(oi1b.build()); List oi2l = list(oi2b.build()); Map refdata = new HashMap(); refdata.put("refs", list(wsiorig.getName() + "/foo/1")); - saveObject(user, wsi, null, refdata, reftype, "ref", new Provenance(user)); + saveObject(user, wsi, null, refdata, reftype, "ref", basicProv(user)); refdata.put("refs", list(wsiorig.getName() + "/foo2/1")); - saveObject(user, wsi, null, refdata, reftype, "ref2", new Provenance(user)); + saveObject(user, wsi, null, refdata, reftype, "ref2", basicProv(user)); final ObjectIdentifier ref = ObjectIdentifier.getBuilder(wsi).withName("ref") .withVersion(1).build(); final ObjectIdentifier.Builder ref2b = ObjectIdentifier.getBuilder(wsi).withName("ref2") @@ -8759,7 +8840,7 @@ public void useFileVsMemoryForData() throws Exception { data1.put("z", 1); data1.put("y", 2); - Provenance p = new Provenance(user); + Provenance p = basicProv(user); List objs = new ArrayList(); objs.add(new WorkspaceSaveObject(getRandomName(), data1, SAFE_TYPE1, null, p, false)); @@ -8883,7 +8964,7 @@ public void createdTempFile(File f) { new TypeDefName("CopyRev", "RefType"), 1, 0); Map refdata = new HashMap(); refdata.put("refs", list(wsi.getName() + "/2/1")); - saveObject(user, wsi, null, refdata, reftype, "ref", new Provenance(user)); + saveObject(user, wsi, null, refdata, reftype, "ref", basicProv(user)); List refAndStd = list( oi1b.withSubsetSelection(null).build(), ObjectIdentifier.getBuilder(wsi).withName("ref").withVersion(1) @@ -8930,7 +9011,7 @@ public void storedDataIsSorted() throws Exception { data1.put("y", 2); String expected = "{\"y\":2,\"z\":1}"; - Provenance p = new Provenance(user); + Provenance p = basicProv(user); List objs = new ArrayList(); objs.add(new WorkspaceSaveObject(getRandomName(), data1, SAFE_TYPE1, null, p, false)); ws.saveObjects(user, wsi, objs, getIdFactory()); @@ -8951,7 +9032,7 @@ public void exceedSortMemory() throws Exception { WorkspaceUser user = new WorkspaceUser("exceedSortMem"); WorkspaceIdentifier wsi = new WorkspaceIdentifier("exceedsortmem"); ws.createWorkspace(user, wsi.getIdentifierString(), false, null, null); - Provenance p = new Provenance(user); + Provenance p = basicProv(user); List objs = new ArrayList(); String safejson = "{\"z\":\"a\"}"; diff --git a/src/us/kbase/workspace/test/workspace/WorkspaceTester.java b/src/us/kbase/workspace/test/workspace/WorkspaceTester.java index 4b8886f49..53426278b 100644 --- a/src/us/kbase/workspace/test/workspace/WorkspaceTester.java +++ b/src/us/kbase/workspace/test/workspace/WorkspaceTester.java @@ -65,7 +65,6 @@ import us.kbase.workspace.database.ObjectIdentifier; import us.kbase.workspace.database.ObjectInformation; import us.kbase.workspace.database.Permission; -import us.kbase.workspace.database.Provenance; import us.kbase.workspace.database.Reference; import us.kbase.workspace.database.ResolvedWorkspaceID; import us.kbase.workspace.database.Types; @@ -84,6 +83,7 @@ import us.kbase.workspace.database.mongo.S3BlobStore; import us.kbase.workspace.database.mongo.S3ClientWithPresign; import us.kbase.workspace.database.provenance.ExternalData; +import us.kbase.workspace.database.provenance.Provenance; import us.kbase.workspace.database.provenance.ProvenanceAction; import us.kbase.workspace.database.provenance.SubAction; import us.kbase.workspace.test.JsonTokenStreamOCStat; @@ -1031,7 +1031,7 @@ public static void failGetSubset( } } - protected List checkProvenanceCorrect( + protected List checkProvenanceCorrect( final WorkspaceUser foo, final Provenance prov, final ObjectIdentifier obj, @@ -1054,7 +1054,7 @@ protected void checkProvenanceCorrect(Provenance expected, Provenance got, assertThat("user equal", got.getUser(), is(expected.getUser())); assertThat("same number actions", got.getActions().size(), is(expected.getActions().size())); - assertThat("wsid correct", got.getWorkspaceID(), is(wsid)); + assertThat("wsid correct", got.getWorkspaceID().get(), is(wsid)); if (refmap == null) { assertThat("dates are the same", got.getDate(), is(expected.getDate())); } else { diff --git a/src/us/kbase/workspace/test/workspace/WorkspaceUnitTest.java b/src/us/kbase/workspace/test/workspace/WorkspaceUnitTest.java index 06a8599fd..eb77be089 100644 --- a/src/us/kbase/workspace/test/workspace/WorkspaceUnitTest.java +++ b/src/us/kbase/workspace/test/workspace/WorkspaceUnitTest.java @@ -11,6 +11,7 @@ import static org.mockito.Mockito.when; import static us.kbase.common.test.TestCommon.set; import static us.kbase.common.test.TestCommon.list; +import static us.kbase.workspace.test.WorkspaceTestCommon.basicProv; import java.time.Instant; import java.util.Date; @@ -37,6 +38,7 @@ import us.kbase.workspace.database.WorkspaceUserMetadata; import us.kbase.workspace.database.exceptions.CorruptWorkspaceDBException; import us.kbase.workspace.database.exceptions.NoObjectDataException; +import us.kbase.workspace.database.provenance.Provenance; import us.kbase.workspace.exceptions.WorkspaceAuthorizationException; import us.kbase.common.test.TestCommon; import us.kbase.typedobj.core.SubsetSelection; @@ -51,7 +53,6 @@ import us.kbase.workspace.database.ObjectInformation; import us.kbase.workspace.database.Permission; import us.kbase.workspace.database.PermissionSet; -import us.kbase.workspace.database.Provenance; import us.kbase.workspace.database.ResolvedWorkspaceID; import us.kbase.workspace.database.ResourceUsageConfigurationBuilder; import us.kbase.workspace.database.ResourceUsageConfigurationBuilder.ResourceUsageConfiguration; @@ -355,7 +356,7 @@ public void getObjectsFailMissingData() throws Exception { final WorkspaceUser u = new WorkspaceUser("u1"); final WorkspaceIdentifier wsi = new WorkspaceIdentifier(1); final ResolvedWorkspaceID rwsi = new ResolvedWorkspaceID(1, "foo", false, false); - final Provenance p = new Provenance(u); + final Provenance p = basicProv(u); final List objs = list( ObjectIdentifier.getBuilder(wsi).withID(1L).build()); final Set robjs = set(new ObjectIDResolvedWS(rwsi, 1)); @@ -399,7 +400,7 @@ private void getObjectsBackendScaling(final int scaling) throws Exception { final WorkspaceUser u = new WorkspaceUser("u1"); final WorkspaceIdentifier wsi = new WorkspaceIdentifier(1); final ResolvedWorkspaceID rwsi = new ResolvedWorkspaceID(1, "foo", false, false); - final Provenance p = new Provenance(u); + final Provenance p = basicProv(u); final List objs = list( ObjectIdentifier.getBuilder(wsi).withID(1L).build()); final Set robjs = set(new ObjectIDResolvedWS(rwsi, 1)); @@ -448,7 +449,7 @@ public void getObjects10K() throws Exception { final WorkspaceUser u = new WorkspaceUser("u1"); final WorkspaceIdentifier wsi = new WorkspaceIdentifier(1); final ResolvedWorkspaceID rwsi = new ResolvedWorkspaceID(1, "foo", false, false); - final Provenance p = new Provenance(u); + final Provenance p = basicProv(u); final ObjectIdentifier.Builder oi = ObjectIdentifier.getBuilder(wsi).withID(1L); final List objs = LongStream.range(1, 10001) .mapToObj(i -> oi.withID(i).build()).collect(Collectors.toList());