diff --git a/src/us/kbase/workspace/WorkspaceServer.java b/src/us/kbase/workspace/WorkspaceServer.java index f12f9da3..e8a541ce 100644 --- a/src/us/kbase/workspace/WorkspaceServer.java +++ b/src/us/kbase/workspace/WorkspaceServer.java @@ -734,7 +734,7 @@ public GetObjectOutput getObject(GetObjectParams params, AuthToken authPart, Rpc resourcesToDelete.set(Arrays.asList(ret)); returnVal = new GetObjectOutput() .withData(ret.getSerializedData().get().getUObject()) - .withMetadata(objInfoToMetaTuple(ret.getObjectInfo(), true)); + .withMetadata(objInfoToMetaTuple(ret.getObjectInfo(), true, false)); //END get_object return returnVal; } @@ -868,8 +868,10 @@ public List>>> returnVal = null; //BEGIN list_referencing_objects final List loi = processObjectIdentifiers(objectIds); - returnVal = translateObjectInfoList(ws.getReferencingObjects( - wsmeth.getUser(authPart), loi), false); + returnVal = translateObjectInfoList( + ws.getReferencingObjects(wsmeth.getUser(authPart), loi), + false, + false); //END list_referencing_objects return returnVal; } @@ -1045,7 +1047,7 @@ public List>> returnVal = null; //BEGIN get_object_info final List loi = processObjectIdentifiers(objectIds); + final boolean includeMeta = longToBoolean(includeMetadata); returnVal = objInfoToTuple( - ws.getObjectInformation(wsmeth.getUser(authPart), loi, - longToBoolean(includeMetadata), false), true); + ws.getObjectInformation(wsmeth.getUser(authPart), loi, includeMeta, false), + true, + !includeMeta); //END get_object_info return returnVal; } @@ -1134,10 +1144,15 @@ public List loi = processObjectSpecifications( params.getObjects()); + final boolean includeMeta = longToBoolean(params.getIncludeMetadata()); returnVal = objInfoToTuple( - ws.getObjectInformation(wsmeth.getUser(authPart), loi, - longToBoolean(params.getIncludeMetadata()), - longToBoolean(params.getIgnoreErrors())), true); + ws.getObjectInformation( + wsmeth.getUser(authPart), + loi, + includeMeta, + longToBoolean(params.getIgnoreErrors())), + true, + !includeMeta); //END get_object_info_new return returnVal; } @@ -1193,8 +1208,10 @@ public Tuple11> returnVal = null; //BEGIN revert_object final ObjectIdentifier oi = processObjectIdentifier(object); - returnVal = objInfoToTuple(ws.revertObject( - wsmeth.getUser(authPart), oi), true); + returnVal = objInfoToTuple(ws.revertObject(wsmeth.getUser(authPart), oi), true, false); //END revert_object return returnVal; } diff --git a/src/us/kbase/workspace/database/ObjectInformation.java b/src/us/kbase/workspace/database/ObjectInformation.java index 5ede2eec..cb68620c 100644 --- a/src/us/kbase/workspace/database/ObjectInformation.java +++ b/src/us/kbase/workspace/database/ObjectInformation.java @@ -149,12 +149,22 @@ public Optional getUserMetaData() { return Optional.ofNullable(usermeta); } - /** Returns the user supplied and automatically generated metadata for the object as a map - * or null if no user metadata was provided. - * @return the metadata or null. + /** Returns the user supplied and automatically generated metadata for the object as a map. + * + * @param nullIfEmpty return null rather than an empty map if there is no metadata available. + * @return the metadata (which may be empty) or null. */ - public Map getUserMetaDataMapOrNull() { - return usermeta == null ? null : usermeta.getMetadata(); + public Map getUserMetaDataMap(final boolean nullIfEmpty) { + return getMetadataMap(usermeta, nullIfEmpty); + } + + private Map getMetadataMap( + final UncheckedUserMetadata meta, + boolean nullIfEmpty) { + if (meta == null) { + return nullIfEmpty ? null : Collections.emptyMap(); + } + return meta.getMetadata(); } /** Returns the administrative user supplied metadata for the object. @@ -164,12 +174,13 @@ public Optional getAdminUserMetaData() { return Optional.ofNullable(adminmeta); } - /** Returns the administrative user supplied metadata for the object as a map - * or null if no metadata was provided. - * @return the metadata or null. + /** Returns the administrative user supplied metadata for the object as a map. + + * @param nullIfEmpty return null rather than an empty map if there is no metadata available. + * @return the metadata (which may be empty) or null. */ - public Map getAdminUserMetaDataMapOrNull() { - return adminmeta == null ? null : adminmeta.getMetadata(); + public Map getAdminUserMetaDataMap(final boolean nullIfEmpty) { + return getMetadataMap(adminmeta, nullIfEmpty); } /** Returns the resolved reference path to this object from a user-accessible object. There may @@ -397,24 +408,28 @@ public Builder withSize(final long size) { } /** Add the optional user provided and / or autogenerated metadata to the builder. + * + * Empty metadata is treated the same way as a null argument. * * A null argument will remove any previously set metadata. * @param metadata the metadata * @return this builder for chaining. */ public Builder withUserMetadata(final UncheckedUserMetadata metadata) { - this.usermeta = metadata; + this.usermeta = metadata == null || metadata.isEmpty() ? null : metadata; return this; } /** Add the optional administrative user provided metadata to the builder. + * + * Empty metadata is treated the same way as a null argument. * * A null argument will remove any previously set metadata. * @param metadata the metadata * @return this builder for chaining. */ public Builder withAdminUserMetadata(final UncheckedUserMetadata metadata) { - this.adminmeta = metadata; + this.adminmeta = metadata == null || metadata.isEmpty() ? null : metadata; return this; } diff --git a/src/us/kbase/workspace/database/UncheckedUserMetadata.java b/src/us/kbase/workspace/database/UncheckedUserMetadata.java index 54b98e32..10a1af82 100644 --- a/src/us/kbase/workspace/database/UncheckedUserMetadata.java +++ b/src/us/kbase/workspace/database/UncheckedUserMetadata.java @@ -3,6 +3,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.Map; +import java.util.Objects; /** User (including, potentially administrative users) provided metadata container. * This class performs no checks on the metadata and is intended for returning metadata to the @@ -16,7 +17,7 @@ */ public class UncheckedUserMetadata { - private Map metadata; + private final Map metadata; /** Create a new unchecked metadata container * @param meta a map containing metadata. If null, an empty metadata map is @@ -48,6 +49,13 @@ public UncheckedUserMetadata(final WorkspaceUserMetadata meta) { public Map getMetadata() { return Collections.unmodifiableMap(metadata); } + + /** Returns true if there is no metadata. + * @return true if there is no metadata. + */ + public boolean isEmpty() { + return metadata.isEmpty(); + } @Override public String toString() { @@ -60,18 +68,21 @@ public String toString() { @Override public int hashCode() { - return 31 + metadata.hashCode(); + return Objects.hash(metadata); } @Override public boolean equals(Object obj) { - if (this == obj) + if (this == obj) { return true; - if (obj == null) + } + if (obj == null) { return false; - if (getClass() != obj.getClass()) + } + if (getClass() != obj.getClass()) { return false; - final UncheckedUserMetadata other = (UncheckedUserMetadata) obj; - return metadata.equals(other.metadata); + } + UncheckedUserMetadata other = (UncheckedUserMetadata) obj; + return Objects.equals(metadata, other.metadata); } } diff --git a/src/us/kbase/workspace/database/mongo/MongoWorkspaceDB.java b/src/us/kbase/workspace/database/mongo/MongoWorkspaceDB.java index 66291060..66efd111 100644 --- a/src/us/kbase/workspace/database/mongo/MongoWorkspaceDB.java +++ b/src/us/kbase/workspace/database/mongo/MongoWorkspaceDB.java @@ -962,6 +962,10 @@ public Instant lockWorkspace(final ResolvedWorkspaceID rwsi) return Instant.now(); } + // hmm, is there a reason we list the fields rather than just pulling everything? + // seems bug prone + // TODO CODE maybe a field generator that deals with standard field sets? Then only have + // set and test in one place. A few places adding meta fields for instance private static final Set FLDS_VER_COPYOBJ = newHashSet( // include full type name for rollback purposes, remove later Fields.VER_WS_ID, Fields.VER_ID, Fields.VER_VER, Fields.VER_TYPE_FULL, diff --git a/src/us/kbase/workspace/database/mongo/ObjectInfoUtils.java b/src/us/kbase/workspace/database/mongo/ObjectInfoUtils.java index 645ac7ae..80465af6 100644 --- a/src/us/kbase/workspace/database/mongo/ObjectInfoUtils.java +++ b/src/us/kbase/workspace/database/mongo/ObjectInfoUtils.java @@ -174,8 +174,7 @@ static Map metaMongoArrayToHash( return ret; } - static List> metaHashToMongoArray( - final Map usermeta) { + static List> metaHashToMongoArray(final Map usermeta) { final List> meta = new ArrayList<>(); if (usermeta != null) { for (String key: usermeta.keySet()) { diff --git a/src/us/kbase/workspace/kbase/ArgUtils.java b/src/us/kbase/workspace/kbase/ArgUtils.java index 83cb4a71..ef71ccaf 100644 --- a/src/us/kbase/workspace/kbase/ArgUtils.java +++ b/src/us/kbase/workspace/kbase/ArgUtils.java @@ -290,22 +290,24 @@ public static List> w Long, String, String, Long, Map> objInfoToTuple( final ObjectInformation info, - final boolean logObjects) { + final boolean logObjects, + final boolean nullForEmptyMeta) { final List m = new ArrayList(); m.add(info); - return objInfoToTuple(m, logObjects).get(0); + return objInfoToTuple(m, logObjects, nullForEmptyMeta).get(0); } public static List>>> translateObjectInfoList( final List> lsoi, - final boolean logObjects) { + final boolean logObjects, + final boolean nullForEmptyMeta) { final List>>> ret = new LinkedList>>>(); for (Set soi: lsoi) { ret.add(objInfoToTuple(new LinkedList(soi), - logObjects)); + logObjects, nullForEmptyMeta)); } return ret; } @@ -314,7 +316,8 @@ public static List> w Long, String, String, Long, Map>> objInfoToTuple( final List info, - final boolean logObjects) { + final boolean logObjects, + final boolean nullForEmptyMeta) { //oh the humanity final List> w .withE8(m.getWorkspaceName()) .withE9(m.getCheckSum()) .withE10(m.getSize()) - .withE11(m.getUserMetaDataMapOrNull())); + .withE11(m.getUserMetaDataMap(nullForEmptyMeta))); } } return ret; @@ -353,17 +356,19 @@ public static List> w String, String, String, Map, Long> objInfoToMetaTuple( final ObjectInformation info, - final boolean logObjects) { + final boolean logObjects, + final boolean nullForEmptyMeta) { final List m = new ArrayList(); m.add(info); - return objInfoToMetaTuple(m, logObjects).get(0); + return objInfoToMetaTuple(m, logObjects, nullForEmptyMeta).get(0); } public static List, Long>> objInfoToMetaTuple( final List info, - final boolean logObjects) { + final boolean logObjects, + final boolean nullForEmptyMeta) { //oh the humanity final List, Long>> ret = @@ -387,7 +392,7 @@ public static List> w .withE8(m.getWorkspaceName()) .withE9("")//ref is deprecated .withE10(m.getCheckSum()) - .withE11(m.getUserMetaDataMapOrNull()) + .withE11(m.getUserMetaDataMap(nullForEmptyMeta)) .withE12(m.getObjectId())); } return ret; @@ -433,7 +438,7 @@ public static List translateObjectData( } ret.add(new ObjectData() .withData(data) - .withInfo(objInfoToTuple(o.getObjectInfo(), logObjects)) + .withInfo(objInfoToTuple(o.getObjectInfo(), logObjects, false)) .withPath(toObjectPath(o.getObjectInfo().getReferencePath())) .withProvenance(translateProvenanceActions(o.getProvenance().getActions())) .withCreator(o.getProvenance().getUser().getUser()) @@ -489,7 +494,7 @@ public static List translateObjectProvI final PermError error = makeExternalIDsReadable( Arrays.asList(o), Optional.of(permHandler)).get(o); ret.add(new us.kbase.workspace.ObjectProvenanceInfo() - .withInfo(objInfoToTuple(o.getObjectInfo(), logObjects)) + .withInfo(objInfoToTuple(o.getObjectInfo(), logObjects, false)) .withProvenance(translateProvenanceActions(o.getProvenance().getActions())) .withCreator(o.getProvenance().getUser().getUser()) .withOrigWsid(o.getProvenance().getWorkspaceID().orElse(null)) diff --git a/src/us/kbase/workspace/kbase/WorkspaceServerMethods.java b/src/us/kbase/workspace/kbase/WorkspaceServerMethods.java index 4cae6f6d..12b072b3 100644 --- a/src/us/kbase/workspace/kbase/WorkspaceServerMethods.java +++ b/src/us/kbase/workspace/kbase/WorkspaceServerMethods.java @@ -387,7 +387,7 @@ public List meta = ws.saveObjects(user, wsi, woc, fac); - return objInfoToTuple(meta, true); + return objInfoToTuple(meta, true, false); } /** Get object information. @@ -413,11 +413,14 @@ public GetObjectInfo3Results getObjectInformation( ReferenceSearchMaximumSizeExceededException { checkAddlArgs(params.getAdditionalProperties(), params.getClass()); final List loi = processObjectSpecifications(params.getObjects()); - final List infos = ws.getObjectInformation(user, loi, - longToBoolean(params.getIncludeMetadata()), + final boolean includeMeta = longToBoolean(params.getIncludeMetadata()); + final List infos = ws.getObjectInformation( + user, + loi, + includeMeta, longToBoolean(params.getIgnoreErrors()), asAdmin); - return new GetObjectInfo3Results().withInfos(objInfoToTuple(infos, true)) + return new GetObjectInfo3Results().withInfos(objInfoToTuple(infos, true, !includeMeta)) .withPaths(toObjectPaths(infos)); } @@ -592,6 +595,7 @@ Map>> listObjects( "Cannot specify both timestamp and epoch for after parameter"); final Instant before = chooseInstant(params.getBefore(), params.getBeforeEpoch(), "Cannot specify both timestamp and epoch for before parameter"); + final boolean includeMeta = longToBoolean(params.getIncludeMetadata()); final ListObjectsParameters lop = ListObjectsParameters.getBuilder(wsis) .withUser(user) .withAsAdmin(asAdmin) @@ -608,11 +612,11 @@ Map>> listObjects( .withShowDeleted(longToBoolean(params.getShowDeleted())) .withShowOnlyDeleted(longToBoolean(params.getShowOnlyDeleted())) .withShowAllVersions(longToBoolean(params.getShowAllVersions())) - .withIncludeMetaData(longToBoolean(params.getIncludeMetadata())) + .withIncludeMetaData(includeMeta) .withLimit(longToInt(params.getLimit(), "Limit", -1)) .build(); - return objInfoToTuple(ws.listObjects(lop), false); + return objInfoToTuple(ws.listObjects(lop), false, !includeMeta); } /** Get all versions of an object. @@ -634,6 +638,6 @@ Long, Map>> getObjectHistory( throws WorkspaceCommunicationException, InaccessibleObjectException, CorruptWorkspaceDBException, NoSuchObjectException { final ObjectIdentifier oi = processObjectIdentifier(object); - return objInfoToTuple(ws.getObjectHistory(user, oi, asAdmin), true); + return objInfoToTuple(ws.getObjectHistory(user, oi, asAdmin), true, false); } } diff --git a/src/us/kbase/workspace/test/database/mongo/MongoWorkspaceDBTest.java b/src/us/kbase/workspace/test/database/mongo/MongoWorkspaceDBTest.java index 60502af9..74576f96 100644 --- a/src/us/kbase/workspace/test/database/mongo/MongoWorkspaceDBTest.java +++ b/src/us/kbase/workspace/test/database/mongo/MongoWorkspaceDBTest.java @@ -849,7 +849,7 @@ public void failDynamicConfigSet() throws Exception { } @Test - public void setWorkspaceMetadata() throws Exception { + public void setWorkspaceMeta() throws Exception { // Tests the immediately successful case only. See the mongo internal tests class // for tests for cases where there's at least one failure trying to update the data. final PartialMock mocks = new PartialMock(MONGO_DB); @@ -904,7 +904,7 @@ public void setWorkspaceMetadata() throws Exception { } @Test - public void setWorkspaceMetadataRemoveOnly() throws Exception { + public void setWorkspaceMetaRemoveOnly() throws Exception { final PartialMock mocks = new PartialMock(MONGO_DB); final WorkspaceUser user = new WorkspaceUser("a"); final ResolvedWorkspaceID rwsi = new ResolvedWorkspaceID(1, "wsn", false, false); @@ -925,7 +925,7 @@ public void setWorkspaceMetadataRemoveOnly() throws Exception { } @Test - public void setWorkspaceMetadataNoop() throws Exception { + public void setWorkspaceMetaNoop() throws Exception { // Tests the case where if the DB was updated with the provided changes the actual // metadata wouldn't change final PartialMock mocks = new PartialMock(MONGO_DB); diff --git a/src/us/kbase/workspace/test/workspace/ObjectInformationTest.java b/src/us/kbase/workspace/test/workspace/ObjectInformationTest.java index 1bf6ee2c..f37db18c 100644 --- a/src/us/kbase/workspace/test/workspace/ObjectInformationTest.java +++ b/src/us/kbase/workspace/test/workspace/ObjectInformationTest.java @@ -14,6 +14,7 @@ import java.util.HashMap; import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.Optional; import org.junit.Test; @@ -37,6 +38,7 @@ public class ObjectInformationTest { new TypeDefName("type.t"), 3, 7); private static final Instant INST = inst(10000); private static final MD5 MDFIVE = new MD5("9a5b862b3f6969ec491ddeea83590e04"); + private static final Map MT = Collections.emptyMap(); @Test public void equals() throws Exception { @@ -68,9 +70,11 @@ public void buildMinimalWithStandardInputs() { is("9a5b862b3f6969ec491ddeea83590e04")); assertThat("incorrect obj size", oi.getSize(), is(5L)); assertThat("incorrect user meta", oi.getUserMetaData(), is(Optional.empty())); - assertThat("incorrect user meta", oi.getUserMetaDataMapOrNull(), is(nullValue())); + assertThat("incorrect user meta", oi.getUserMetaDataMap(false), is(MT)); + assertThat("incorrect user meta", oi.getUserMetaDataMap(true), is(nullValue())); assertThat("incorrect admin meta", oi.getAdminUserMetaData(), is(Optional.empty())); - assertThat("incorrect admin meta", oi.getAdminUserMetaDataMapOrNull(), is(nullValue())); + assertThat("incorrect admin meta", oi.getAdminUserMetaDataMap(false), is(MT)); + assertThat("incorrect admin meta", oi.getAdminUserMetaDataMap(true), is(nullValue())); assertThat("incorrect ref path", oi.getReferencePath(), is(Arrays.asList(new Reference(4, 1, 3)))); } @@ -87,6 +91,21 @@ private ObjectInformation.Builder buildFullWithAlternativeInputsSetup() { .withChecksum("uhOhNoCheckingHere") .withSize(890); } + + @Test + public void buildFullWithAlternativeInputsAndNullMetadata() { + final ObjectInformation oi = buildFullWithAlternativeInputsSetup() + .withUserMetadata(null) + .withAdminUserMetadata(null) + .build(); + buildFullWithAlternativeInputsSharedChecks(oi); + assertThat("incorrect user meta", oi.getUserMetaData(), is(Optional.empty())); + assertThat("incorrect user meta", oi.getUserMetaDataMap(false), is(MT)); + assertThat("incorrect user meta", oi.getUserMetaDataMap(true), is(nullValue())); + assertThat("incorrect admin meta", oi.getAdminUserMetaData(), is(Optional.empty())); + assertThat("incorrect admin meta", oi.getAdminUserMetaDataMap(false), is(MT)); + assertThat("incorrect admin meta", oi.getAdminUserMetaDataMap(true), is(nullValue())); + } @Test public void buildFullWithAlternativeInputsAndEmptyMetadata() { @@ -95,13 +114,12 @@ public void buildFullWithAlternativeInputsAndEmptyMetadata() { .withAdminUserMetadata(new UncheckedUserMetadata(new HashMap<>())) .build(); buildFullWithAlternativeInputsSharedChecks(oi); - assertThat("incorrect user meta", oi.getUserMetaData(), - is(Optional.of(new UncheckedUserMetadata(new HashMap<>())))); - assertThat("incorrect user meta", oi.getUserMetaDataMapOrNull(), is(new HashMap<>())); - assertThat("incorrect admin meta", oi.getAdminUserMetaData(), - is(Optional.of(new UncheckedUserMetadata(new HashMap<>())))); - assertThat("incorrect admin meta", oi.getAdminUserMetaDataMapOrNull(), - is(new HashMap<>())); + assertThat("incorrect user meta", oi.getUserMetaData(), is(Optional.empty())); + assertThat("incorrect user meta", oi.getUserMetaDataMap(false), is(MT)); + assertThat("incorrect user meta", oi.getUserMetaDataMap(true), is(nullValue())); + assertThat("incorrect admin meta", oi.getAdminUserMetaData(), is(Optional.empty())); + assertThat("incorrect admin meta", oi.getAdminUserMetaDataMap(false), is(MT)); + assertThat("incorrect admin meta", oi.getAdminUserMetaDataMap(true), is(nullValue())); } @Test @@ -116,12 +134,16 @@ public void buildFullWithAlternativeInputsAndPopulatedMetadata() { assertThat("incorrect user meta", oi.getUserMetaData(), is(Optional.of(new UncheckedUserMetadata(ImmutableMap.of( "foo", "bar", "baz", "bat"))))); - assertThat("incorrect user meta", oi.getUserMetaDataMapOrNull(), is(ImmutableMap.of( + assertThat("incorrect user meta", oi.getUserMetaDataMap(false), is(ImmutableMap.of( + "foo", "bar", "baz", "bat"))); + assertThat("incorrect user meta", oi.getUserMetaDataMap(true), is(ImmutableMap.of( "foo", "bar", "baz", "bat"))); assertThat("incorrect admin meta", oi.getAdminUserMetaData(), is(Optional.of(new UncheckedUserMetadata(ImmutableMap.of( "role", "admin", "why", "ImBetterThanYou"))))); - assertThat("incorrect admin meta", oi.getAdminUserMetaDataMapOrNull(), is(ImmutableMap.of( + assertThat("incorrect admin meta", oi.getAdminUserMetaDataMap(false), is(ImmutableMap.of( + "role", "admin", "why", "ImBetterThanYou"))); + assertThat("incorrect admin meta", oi.getAdminUserMetaDataMap(true), is(ImmutableMap.of( "role", "admin", "why", "ImBetterThanYou"))); } @@ -136,11 +158,15 @@ public void buildFullOverwriteMetadata() throws Exception { buildFullWithAlternativeInputsSharedChecks(oi); assertThat("incorrect user meta", oi.getUserMetaData(), is(Optional.of(new UncheckedUserMetadata(ImmutableMap.of("c", "d"))))); - assertThat("incorrect user meta", oi.getUserMetaDataMapOrNull(), + assertThat("incorrect user meta", oi.getUserMetaDataMap(false), + is(ImmutableMap.of("c", "d"))); + assertThat("incorrect user meta", oi.getUserMetaDataMap(true), is(ImmutableMap.of("c", "d"))); assertThat("incorrect admin meta", oi.getAdminUserMetaData(), is(Optional.of(new UncheckedUserMetadata(ImmutableMap.of("g", "h"))))); - assertThat("incorrect admin meta", oi.getAdminUserMetaDataMapOrNull(), + assertThat("incorrect admin meta", oi.getAdminUserMetaDataMap(false), + is(ImmutableMap.of("g", "h"))); + assertThat("incorrect admin meta", oi.getAdminUserMetaDataMap(true), is(ImmutableMap.of("g", "h"))); } @@ -439,11 +465,15 @@ public void refPath() { assertThat("incorrect obj size", oi2.getSize(), is(5L)); assertThat("incorrect user meta", oi2.getUserMetaData(), is(Optional.of(new UncheckedUserMetadata(ImmutableMap.of("x", "y"))))); - assertThat("incorrect user meta", oi2.getUserMetaDataMapOrNull(), + assertThat("incorrect user meta", oi2.getUserMetaDataMap(false), + is(ImmutableMap.of("x", "y"))); + assertThat("incorrect user meta", oi2.getUserMetaDataMap(true), is(ImmutableMap.of("x", "y"))); assertThat("incorrect admin meta", oi2.getAdminUserMetaData(), is(Optional.of(new UncheckedUserMetadata(ImmutableMap.of("w", "z"))))); - assertThat("incorrect admin meta", oi2.getAdminUserMetaDataMapOrNull(), + assertThat("incorrect admin meta", oi2.getAdminUserMetaDataMap(false), + is(ImmutableMap.of("w", "z"))); + assertThat("incorrect admin meta", oi2.getAdminUserMetaDataMap(true), is(ImmutableMap.of("w", "z"))); } diff --git a/src/us/kbase/workspace/test/workspace/UncheckedUserMetadataTest.java b/src/us/kbase/workspace/test/workspace/UncheckedUserMetadataTest.java index 9f8b1962..24723b6b 100644 --- a/src/us/kbase/workspace/test/workspace/UncheckedUserMetadataTest.java +++ b/src/us/kbase/workspace/test/workspace/UncheckedUserMetadataTest.java @@ -4,22 +4,32 @@ import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; +import java.util.Collections; import java.util.HashMap; import java.util.Map; import org.junit.Test; +import nl.jqno.equalsverifier.EqualsVerifier; import us.kbase.workspace.database.UncheckedUserMetadata; import us.kbase.workspace.database.WorkspaceUserMetadata; public class UncheckedUserMetadataTest { + + private static final Map MT = Collections.emptyMap(); + @Test + public void equals() throws Exception { + EqualsVerifier.forClass(UncheckedUserMetadata.class).usingGetClass().verify(); + } + @Test public void constructor() throws Exception { Map m = new HashMap(); m.put("foo", "bar"); UncheckedUserMetadata uum = new UncheckedUserMetadata(m); assertThat("stored correct metadata", uum.getMetadata(), is(m)); + assertThat("isEmpty incorrect", uum.isEmpty(), is(false)); Map origm = new HashMap(m); m.put("baz", "bar"); assertThat("changing constructor map doesn't change metadata contents", @@ -30,27 +40,24 @@ public void constructor() throws Exception { WorkspaceUserMetadata wum = new WorkspaceUserMetadata(m); uum = new UncheckedUserMetadata(wum); assertThat("stored correct metadata", uum.getMetadata(), is(m)); + assertThat("isEmpty incorrect", uum.isEmpty(), is(false)); origm = new HashMap(m); m.put("baz", "bar"); assertThat("changing constructor map doesn't change metadata contents", uum.getMetadata(), is(origm)); - Map mt = new HashMap(); - m = null; - uum = new UncheckedUserMetadata(m); - assertThat("passing null map = empty metadata", uum.getMetadata(), - is(mt)); + uum = new UncheckedUserMetadata((Map) null); + assertThat("passing null map = empty metadata", uum.getMetadata(), is(MT)); + assertThat("isEmpty incorrect", uum.isEmpty(), is(true)); - wum = null; - uum = new UncheckedUserMetadata(wum); - assertThat("passing null workspace meta = empty metadata", - uum.getMetadata(), - is(mt)); + uum = new UncheckedUserMetadata((WorkspaceUserMetadata) null); + assertThat("passing null workspace meta = empty metadata", uum.getMetadata(), is(MT)); + assertThat("isEmpty incorrect", uum.isEmpty(), is(true)); } @Test - public void getMetadata() throws Exception { + public void getMetadataImmutable() throws Exception { Map m = new HashMap(); m.put("foo", "bar"); UncheckedUserMetadata uum = new UncheckedUserMetadata(m); @@ -72,32 +79,4 @@ public void string() throws Exception { is("UncheckedUserMetadata [metadata={foo=bar}]")); } - @Test - public void hashcodeCheck() throws Exception { - Map m = new HashMap(); - m.put("foo", "bar"); - UncheckedUserMetadata uum = new UncheckedUserMetadata(m); - assertThat("hashcode correct", uum.hashCode(), is(61684)); - } - - @SuppressWarnings("unlikely-arg-type") - @Test - public void equalsCheck() throws Exception { - Map m = new HashMap(); - m.put("foo", "bar"); - UncheckedUserMetadata uum = new UncheckedUserMetadata(m); - assertThat("equals same object", uum.equals(uum), is(true)); - assertThat("equals null", uum.equals(null), is(false)); - assertThat("equals diff object", uum.equals(m), is(false)); - - Map m1 = new HashMap(); - m1.put("foo", "bar"); - UncheckedUserMetadata uum1 = new UncheckedUserMetadata(m1); - assertThat("equals equal object", uum.equals(uum1), is(true)); - - m1.put("baz", "whoo"); - uum1 = new UncheckedUserMetadata(m1); - assertThat("equals unequal object", uum.equals(uum1), is(false)); - } - } diff --git a/src/us/kbase/workspace/test/workspace/WorkspaceTest.java b/src/us/kbase/workspace/test/workspace/WorkspaceTest.java index 4247bd6a..35b17c08 100644 --- a/src/us/kbase/workspace/test/workspace/WorkspaceTest.java +++ b/src/us/kbase/workspace/test/workspace/WorkspaceTest.java @@ -9,9 +9,10 @@ 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.list; import static us.kbase.common.test.TestCommon.now; +import static us.kbase.common.test.TestCommon.opt; 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; @@ -1432,18 +1433,18 @@ public void saveObjectsAndGetMetaSimple() throws Exception { long privid = privinfo.getId(); Map data = new HashMap(); Map data2 = new HashMap(); - Map premeta = new HashMap(); Map moredata = new HashMap(); moredata.put("foo", "bar"); data.put("fubar", moredata); JsonNode savedata = MAPPER.valueToTree(data); data2.put("fubar2", moredata); JsonNode savedata2 = MAPPER.valueToTree(data2); - premeta.put("metastuff", "meta"); - WorkspaceUserMetadata meta = new WorkspaceUserMetadata(premeta); - Map premeta2 = new HashMap(); - premeta2.put("meta2", "my hovercraft is full of eels"); - WorkspaceUserMetadata meta2 = new WorkspaceUserMetadata(premeta2); + final WorkspaceUserMetadata meta = new WorkspaceUserMetadata( + ImmutableMap.of("metastuff", "meta")); + final UncheckedUserMetadata umeta = new UncheckedUserMetadata(meta); + final WorkspaceUserMetadata meta2 = new WorkspaceUserMetadata( + ImmutableMap.of("meta2", "my hovercraft is full of eels")); + final UncheckedUserMetadata umeta2 = new UncheckedUserMetadata(meta2); final Provenance p = Provenance.getBuilder(new WorkspaceUser("kbasetest2"), now()) .withAction(ProvenanceAction.getBuilder().withServiceName("some service").build()) .build(); @@ -1483,15 +1484,20 @@ public void saveObjectsAndGetMetaSimple() throws Exception { String chksum1 = "36c4f68f2c98971b9736839232eb08f4"; String chksum2 = "3c59f762140806c36ab48a152f28e840"; checkObjInfo(objinfo.get(0), 1, "auto3", SAFE_TYPE1.getTypeString(), 1, foo, readid, - read.getName(), chksum1, 23, premeta, Arrays.asList(new Reference(readid, 1, 1))); + read.getName(), chksum1, 23, opt(umeta), + Arrays.asList(new Reference(readid, 1, 1))); checkObjInfo(objinfo.get(1), 1, "auto3", SAFE_TYPE1.getTypeString(), 2, foo, readid, - read.getName(), chksum2, 24, premeta2, Arrays.asList(new Reference(readid, 1, 2))); + read.getName(), chksum2, 24, opt(umeta2), + Arrays.asList(new Reference(readid, 1, 2))); checkObjInfo(objinfo.get(2), 2, "auto3-1", SAFE_TYPE1.getTypeString(), 1, foo, readid, - read.getName(), chksum1, 23, premeta, Arrays.asList(new Reference(readid, 2, 1))); + read.getName(), chksum1, 23, opt(umeta), + Arrays.asList(new Reference(readid, 2, 1))); checkObjInfo(objinfo.get(3), 3, "auto3-2", SAFE_TYPE1.getTypeString(), 1, foo, readid, - read.getName(), chksum2, 24, premeta2, Arrays.asList(new Reference(readid, 3, 1))); + read.getName(), chksum2, 24, opt(umeta2), + Arrays.asList(new Reference(readid, 3, 1))); checkObjInfo(objinfo.get(4), 4, "auto4", SAFE_TYPE1.getTypeString(), 1, foo, readid, - read.getName(), chksum1, 23, premeta, Arrays.asList(new Reference(readid, 4, 1))); + read.getName(), chksum1, 23, opt(umeta), + Arrays.asList(new Reference(readid, 4, 1))); List loi = Arrays.asList( ObjectIdentifier.getBuilder(read).withID(1L).build(), @@ -1514,40 +1520,40 @@ public void saveObjectsAndGetMetaSimple() throws Exception { List objinfo2 = ws.getObjectInformation(foo, loi, true, false); List objinfo2NoMeta = ws.getObjectInformation(foo, loi, false, false); checkObjInfo(objinfo2.get(0), 1, "auto3", SAFE_TYPE1.getTypeString(), 2, foo, - readid, read.getName(), chksum2, 24, premeta2, + readid, read.getName(), chksum2, 24, opt(umeta2), Arrays.asList(new Reference(readid, 1, 2))); checkObjInfo(objinfo2.get(1), 1, "auto3", SAFE_TYPE1.getTypeString(), 1, foo, - readid, read.getName(), chksum1, 23, premeta, + readid, read.getName(), chksum1, 23, opt(umeta), Arrays.asList(new Reference(readid, 1, 1))); checkObjInfo(objinfo2.get(2), 1, "auto3", SAFE_TYPE1.getTypeString(), 2, foo, - readid, read.getName(), chksum2, 24, premeta2, + readid, read.getName(), chksum2, 24, opt(umeta2), Arrays.asList(new Reference(readid, 1, 2))); checkObjInfo(objinfo2.get(3), 1, "auto3", SAFE_TYPE1.getTypeString(), 1, foo, - readid, read.getName(), chksum1, 23, premeta, + readid, read.getName(), chksum1, 23, opt(umeta), Arrays.asList(new Reference(readid, 1, 1))); checkObjInfo(objinfo2.get(4), 1, "auto3", SAFE_TYPE1.getTypeString(), 2, foo, - readid, read.getName(), chksum2, 24, premeta2, + readid, read.getName(), chksum2, 24, opt(umeta2), Arrays.asList(new Reference(readid, 1, 2))); checkObjInfo(objinfo2.get(5), 1, "auto3", SAFE_TYPE1.getTypeString(), 1, foo, - readid, read.getName(), chksum1, 23, premeta, + readid, read.getName(), chksum1, 23, opt(umeta), Arrays.asList(new Reference(readid, 1, 1))); checkObjInfo(objinfo2.get(6), 1, "auto3", SAFE_TYPE1.getTypeString(), 2, foo, - readid, read.getName(), chksum2, 24, premeta2, + readid, read.getName(), chksum2, 24, opt(umeta2), Arrays.asList(new Reference(readid, 1, 2))); checkObjInfo(objinfo2.get(7), 1, "auto3", SAFE_TYPE1.getTypeString(), 1, foo, - readid, read.getName(), chksum1, 23, premeta, + readid, read.getName(), chksum1, 23, opt(umeta), Arrays.asList(new Reference(readid, 1, 1))); checkObjInfo(objinfo2.get(8), 3, "auto3-2", SAFE_TYPE1.getTypeString(), 1, foo, - readid, read.getName(), chksum2, 24, premeta2, + readid, read.getName(), chksum2, 24, opt(umeta2), Arrays.asList(new Reference(readid, 3, 1))); checkObjInfo(objinfo2.get(9), 3, "auto3-2", SAFE_TYPE1.getTypeString(), 1, foo, - readid, read.getName(), chksum2, 24, premeta2, + readid, read.getName(), chksum2, 24, opt(umeta2), Arrays.asList(new Reference(readid, 3, 1))); checkObjInfo(objinfo2.get(10), 3, "auto3-2", SAFE_TYPE1.getTypeString(), 1, foo, - readid, read.getName(), chksum2, 24, premeta2, + readid, read.getName(), chksum2, 24, opt(umeta2), Arrays.asList(new Reference(readid, 3, 1))); checkObjInfo(objinfo2.get(11), 3, "auto3-2", SAFE_TYPE1.getTypeString(), 1, foo, - readid, read.getName(), chksum2, 24, premeta2, + readid, read.getName(), chksum2, 24, opt(umeta2), Arrays.asList(new Reference(readid, 3, 1))); checkObjInfo(objinfo2NoMeta.get(0), 1, "auto3", SAFE_TYPE1.getTypeString(), 2, foo, readid, read.getName(), chksum2, 24, null, @@ -1589,8 +1595,6 @@ public void saveObjectsAndGetMetaSimple() throws Exception { List retinfo = new ArrayList(); final ResolvedWorkspaceID fakews = new ResolvedWorkspaceID( readid, read.getName(), false, false); - UncheckedUserMetadata umeta = new UncheckedUserMetadata(meta); - UncheckedUserMetadata umeta2 = new UncheckedUserMetadata(meta2); retinfo.add(unreadableOI(1, "auto3", SAFE_TYPE1, 2, foo, fakews, chksum2, 24, umeta2)); retinfo.add(unreadableOI(1, "auto3", SAFE_TYPE1, 1, foo, fakews, chksum1, 23, umeta)); retinfo.add(unreadableOI(1, "auto3", SAFE_TYPE1, 2, foo, fakews, chksum2, 24, umeta2)); @@ -1616,12 +1620,14 @@ public void saveObjectsAndGetMetaSimple() throws Exception { objinfo = ws.saveObjects(foo, read, objects, foofac); ws.saveObjects(foo, priv, objects, foofac); checkObjInfo(objinfo.get(0), 2, "auto3-1", SAFE_TYPE1.getTypeString(), 2, foo, readid, - read.getName(), chksum1, 23, premeta2, Arrays.asList(new Reference(readid, 2, 2))); + read.getName(), chksum1, 23, opt(umeta2), + Arrays.asList(new Reference(readid, 2, 2))); final ObjectIdentifier r2 = ObjectIdentifier.getBuilder(read).withID(2L).build(); final ObjectIdentifier p2 = ObjectIdentifier.getBuilder(priv).withID(2L).build(); objinfo2 = ws.getObjectInformation(foo, Arrays.asList(r2), true, false); checkObjInfo(objinfo2.get(0), 2, "auto3-1", SAFE_TYPE1.getTypeString(), 2, foo, readid, - read.getName(), chksum1, 23, premeta2, Arrays.asList(new Reference(readid, 2, 2))); + read.getName(), chksum1, 23, opt(umeta2), + Arrays.asList(new Reference(readid, 2, 2))); ws.getObjectInformation(bar, Arrays.asList(r2), true, false); //should work try { @@ -1645,7 +1651,8 @@ public void saveObjectsAndGetMetaSimple() throws Exception { ws.setPermissions(foo, priv, Arrays.asList(bar), Permission.READ); objinfo2 = ws.getObjectInformation(bar, Arrays.asList(p2), true, false); checkObjInfo(objinfo2.get(0), 2, "auto3-1", SAFE_TYPE1.getTypeString(), 2, foo, privid, - priv.getName(), chksum1, 23, premeta2, Arrays.asList(new Reference(privid, 2, 2))); + priv.getName(), chksum1, 23, opt(umeta2), + Arrays.asList(new Reference(privid, 2, 2))); checkObjectAndInfo( bar, @@ -1671,7 +1678,8 @@ public void saveObjectsAndGetMetaSimple() throws Exception { ws.setPermissions(foo, priv, Arrays.asList(bar), Permission.WRITE); objinfo = ws.saveObjects(bar, priv, objects, barfac); checkObjInfo(objinfo.get(0), 2, "auto3-1", SAFE_TYPE1.getTypeString(), 3, bar, privid, - priv.getName(), chksum1, 23, premeta2, Arrays.asList(new Reference(privid, 2, 3))); + priv.getName(), chksum1, 23, opt(umeta2), + Arrays.asList(new Reference(privid, 2, 3))); failGetObjects( foo, Arrays.asList(ObjectIdentifier.getBuilder(read).withName("booger").build()), @@ -5123,14 +5131,14 @@ public void cloneCopySave() throws Exception { SAFE_TYPE1, null, p, false)), getIdFactory()).get(0); checkObjInfo(oi, 2L, "bar", SAFE_TYPE1.getTypeString(), 1, user, 2, "target", - "99914b932bd37a50b983c5e7c90ae93b", 2, mt, + "99914b932bd37a50b983c5e7c90ae93b", 2, null, Arrays.asList(new Reference(2, 2, 1))); ObjectInformation oi2 = ws.copyObject( user, ObjectIdentifier.getBuilder(source).withName("o1").build(), ObjectIdentifier.getBuilder(target).withName("foo").build()); checkObjInfo(oi2, 3L, "foo", SAFE_TYPE1.getTypeString(), 1, user, 2, "target", - "99914b932bd37a50b983c5e7c90ae93b", 2, mt, + "99914b932bd37a50b983c5e7c90ae93b", 2, null, Arrays.asList(new Reference(2, 3, 1))); WorkspaceInformation i = ws.getWorkspaceInformation(user, target); diff --git a/src/us/kbase/workspace/test/workspace/WorkspaceTester.java b/src/us/kbase/workspace/test/workspace/WorkspaceTester.java index 07d73261..68ec88c9 100644 --- a/src/us/kbase/workspace/test/workspace/WorkspaceTester.java +++ b/src/us/kbase/workspace/test/workspace/WorkspaceTester.java @@ -69,6 +69,7 @@ import us.kbase.workspace.database.Reference; import us.kbase.workspace.database.ResolvedWorkspaceID; import us.kbase.workspace.database.Types; +import us.kbase.workspace.database.UncheckedUserMetadata; import us.kbase.workspace.database.WorkspaceUserMetadata; import us.kbase.workspace.database.ResourceUsageConfigurationBuilder; import us.kbase.workspace.database.Workspace; @@ -642,9 +643,10 @@ protected void checkObjInfo( final String wsname, final String chksum, final long size, - final Map usermeta, + Optional usermeta, final List refpath) { + usermeta = usermeta == null ? Optional.empty() : usermeta; assertDateisRecent(info.getSavedDate()); assertThat("Object id incorrect", info.getObjectId(), is(id)); assertThat("Object name is incorrect", info.getObjectName(), is(name)); @@ -655,9 +657,7 @@ protected void checkObjInfo( assertThat("Object workspace name is incorrect", info.getWorkspaceName(), is(wsname)); assertThat("Object chksum is incorrect", info.getCheckSum(), is(chksum)); assertThat("Object size is incorrect", info.getSize(), is(size)); - Map meta = info.getUserMetaData().isEmpty() ? null : - info.getUserMetaData().get().getMetadata(); - assertThat("Object user meta is incorrect", meta, is(usermeta)); + assertThat("Object user meta is incorrect", info.getUserMetaData(), is(usermeta)); assertThat("Object refpath incorrect", info.getReferencePath(), is(refpath)); } @@ -820,7 +820,7 @@ protected void checkObjectAndInfo( inf.getWorkspaceName(), inf.getCheckSum(), inf.getSize(), - inf.getUserMetaData().get().getMetadata(), + inf.getUserMetaData(), inf.getReferencePath()); } if (info.hasNext() || dataiter.hasNext() || provi.hasNext()) { @@ -849,7 +849,7 @@ protected void checkObjectAndInfo( info.getWorkspaceName(), info.getCheckSum(), info.getSize(), - info.getUserMetaData().get().getMetadata(), + info.getUserMetaData(), info.getReferencePath()); assertThat("correct data", getData(wod), is((Object) data));