package com.constellio.app.api.cmis.accept;
import static com.constellio.data.conf.HashingEncoding.BASE64;
import static com.constellio.model.entities.security.global.UserCredentialStatus.ACTIVE;
import static java.util.Arrays.asList;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.chemistry.opencmis.client.api.CmisObject;
import org.apache.chemistry.opencmis.client.api.Document;
import org.apache.chemistry.opencmis.client.api.Folder;
import org.apache.chemistry.opencmis.client.api.Session;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import org.apache.chemistry.opencmis.commons.impl.dataobjects.ContentStreamImpl;
import org.joda.time.LocalDateTime;
import org.junit.Before;
import org.junit.Test;
import com.constellio.model.entities.Taxonomy;
import com.constellio.model.entities.records.Content;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.security.global.UserCredential;
import com.constellio.model.services.contents.ContentManager;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.taxonomies.TaxonomiesManager;
import com.constellio.model.services.users.UserServices;
import com.constellio.sdk.tests.ConstellioTest;
import com.constellio.sdk.tests.TestRecord;
import com.constellio.sdk.tests.annotations.DriverTest;
import com.constellio.sdk.tests.schemas.TestsSchemasSetup;
import com.constellio.sdk.tests.schemas.TestsSchemasSetup.ZeSchemaMetadatas;
@DriverTest
public class CmisSinglevalueContentManagementAcceptTest extends ConstellioTest {
private final String PDF_MIMETYPE = "application/pdf";
private final String DOCX_MIMETYPE = "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
LocalDateTime firstDocumentModificationOClock = new LocalDateTime();
LocalDateTime documentCreationOClock = new LocalDateTime().plusHours(1);
LocalDateTime firstDocumentCheckOutOClock = new LocalDateTime().plusHours(2);
LocalDateTime firstDocumentCheckOutModificationOClock = new LocalDateTime().plusHours(3);
LocalDateTime firstDocumentCheckOutCheckInOClock = new LocalDateTime().plusHours(4);
LocalDateTime secondDocumentCheckOutOClock = new LocalDateTime().plusHours(5);
LocalDateTime secondDocumentCheckOutCheckInWithContentOClock = new LocalDateTime().plusHours(6);
LocalDateTime replaceContentOClock = new LocalDateTime().plusHours(7);
LocalDateTime deleteContentOClock = new LocalDateTime().plusHours(8);
ContentManager contentManager;
RecordServices recordServices;
TestsSchemasSetup schemas = new TestsSchemasSetup(zeCollection);
ZeSchemaMetadatas zeSchema = schemas.new ZeSchemaMetadatas();
User bob;
User alice;
String bobId;
String aliceId;
String zeRecord = "zeRecord";
Session session;
String currentUserId;
String zeRecordContentId;
private long pdf1Length = 170039L;
private long pdf2Length = 167347L;
private long docx1Length = 27055L;
private long docx2Length = 27325L;
private String pdf1Hash = "KN8RjbrnBgq1EDDV2U71a6/6gd4=";
private String pdf2Hash = "T+4zq4cGP/tXkdJp/qz1WVWYhoQ=";
private String docx1Hash = "Fss7pKBafi8ok5KaOwEpmNdeGCE=";
private String docx2Hash = "TIKwSvHOXHOOtRd1K9t2fm4TQ4I=";
private String aliceToken, bobToken;
@Before
public void setUp()
throws Exception {
givenHashingEncodingIs(BASE64);
givenTimeIs(firstDocumentModificationOClock);
defineSchemasManager()
.using(schemas.withAContentMetadata());
CmisAcceptanceTestSetup.allSchemaTypesSupported(getAppLayerFactory());
MetadataSchemasManager metadataSchemasManager = getModelLayerFactory().getMetadataSchemasManager();
TaxonomiesManager taxonomiesManager = getModelLayerFactory().getTaxonomiesManager();
Taxonomy taxonomy = Taxonomy.createPublic("taxo", "taxo", zeCollection, asList("zeSchemaType"));
taxonomiesManager.addTaxonomy(taxonomy, metadataSchemasManager);
taxonomiesManager.setPrincipalTaxonomy(taxonomy, metadataSchemasManager);
UserServices userServices = getModelLayerFactory().newUserServices();
userServices.addUpdateUserCredential(userServices.createUserCredential(
"bob", "bob", "gratton", "bob@doculibre.com", new ArrayList<String>(), asList(zeCollection), ACTIVE, null,
Arrays.asList(""), null).withServiceKey("bob-key").withSystemAdminPermission());
userServices.addUpdateUserCredential(userServices.createUserCredential(
"alice", "alice", "wonderland", "alice@doculibre.com", new ArrayList<String>(), asList(zeCollection), ACTIVE,
null, Arrays.asList(""), null).withServiceKey("alice-key").withSystemAdminPermission());
alice = userServices.getUserInCollection("alice", zeCollection);
bob = userServices.getUserInCollection("bob", zeCollection);
aliceToken = userServices.generateToken("alice");
bobToken = userServices.generateToken("bob");
aliceId = alice.getId();
bobId = bob.getId();
recordServices = getModelLayerFactory().newRecordServices();
contentManager = getModelLayerFactory().getContentManager();
alice.setCollectionDeleteAccess(true);
bob.setCollectionDeleteAccess(true);
alice.setCollectionWriteAccess(true);
bob.setCollectionWriteAccess(true);
recordServices.update(alice.getWrappedRecord());
recordServices.update(bob.getWrappedRecord());
CmisAcceptanceTestSetup.giveUseCMISPermissionToUsers(getModelLayerFactory());
}
@Test
public void givenSingleValueContentThenCanManageItWithCmis()
throws Exception {
givenCurrentUserIsAlice();
givenRecord();
session = sessionFor(alice);
Folder folder = (Folder) session.getObject(zeRecord);
assertThat(getContentsOf(zeRecord)).isEmpty();
givenTimeIs(documentCreationOClock);
givenCurrentUserIsAlice();
_1_documentCreation(folder);
givenTimeIs(firstDocumentModificationOClock);
givenCurrentUserIsBob();
_2_firstDocumentModification();
givenTimeIs(firstDocumentCheckOutOClock);
givenCurrentUserIsAlice();
_3_firstDocumentCheckOut();
givenTimeIs(firstDocumentCheckOutModificationOClock);
givenCurrentUserIsAlice();
_4_firstDocumentCheckOutModification();
givenTimeIs(firstDocumentCheckOutCheckInOClock);
givenCurrentUserIsAlice();
_5_firstDocumentCheckOutCheckIn();
givenTimeIs(secondDocumentCheckOutOClock);
givenCurrentUserIsBob();
_6_secondDocumentCheckOut();
givenTimeIs(secondDocumentCheckOutCheckInWithContentOClock);
givenCurrentUserIsBob();
_7_secondDocumentCheckOutCheckInWithContentOClock();
givenTimeIs(replaceContentOClock);
givenCurrentUserIsAlice();
_8_replaceContentOClock(folder);
givenTimeIs(deleteContentOClock);
givenCurrentUserIsBob();
_9_deleteContentOClock();
}
private void _1_documentCreation(Folder folder)
throws IOException {
Map<String, Object> properties = new HashMap<>();
properties.put("metadata", "contentMetadata");
properties.put(PropertyIds.OBJECT_TYPE_ID, "cmis:document");
Document cmisContent = folder.createDocument(properties, pdf1ContentStream(), VersioningState.MAJOR);
Content content = recordServices.getDocumentById(zeRecord).get(zeSchema.contentMetadata());
assertThat(cmisContent.getId()).isEqualTo("content_" + zeRecord + "_contentMetadata_" + content.getId() + "_1.0");
zeRecordContentId = content.getId();
cmisContent = getSingleContentOf(zeRecord);
assertThatContentStreamIsSameAs(cmisContent, pdf1ContentStream(), pdf1Hash);
assertThatVersionCreationInfoAre(cmisContent, aliceId, documentCreationOClock);
assertThat(cmisContent.getId()).isEqualTo("content_" + zeRecord + "_contentMetadata_" + content.getId() + "_1.0");
assertThat(cmisContent.getProperty(PropertyIds.PARENT_ID).getValue()).isEqualTo(zeRecord);
assertThat(cmisContent.getVersionLabel()).isEqualTo("1.0");
assertThat(cmisContent.getVersionSeriesCheckedOutBy()).isNull();
// assertThat(cmisContent.getVersionSeriesCheckedOutId()).isNull();
assertThat(cmisContent.getVersionSeriesId()).isEqualTo("content_" + zeRecord + "_contentMetadata_" + content.getId());
assertThat(cmisContent.isLatestMajorVersion()).isTrue();
assertThat(cmisContent.isLatestVersion()).isTrue();
assertThat(cmisContent.isMajorVersion()).isTrue();
// assertThat(cmisContent.isPrivateWorkingCopy()).isFalse();
assertThat(cmisContent.isVersionSeriesCheckedOut()).isFalse();
assertThat(cmisContent.getPropertyValue("metadata")).isEqualTo("contentMetadata");
}
private Document _2_firstDocumentModification()
throws IOException {
Document cmisContent = getContentsOf(zeRecord).get(0);
cmisContent.setContentStream(docx1ContentStream(), true);
recordServices.refresh(recordServices.getDocumentById(zeRecord));
cmisContent = getContentsOf(zeRecord).get(0);
assertThatContentStreamIsSameAs(cmisContent, docx1ContentStream(), docx1Hash);
assertThatVersionCreationInfoAre(cmisContent, bobId, firstDocumentModificationOClock);
assertThat(cmisContent.getId()).isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_1.1");
assertThat(cmisContent.getProperty(PropertyIds.PARENT_ID).getValue()).isEqualTo(zeRecord);
assertThat(cmisContent.getVersionLabel()).isEqualTo("1.1");
assertThat(cmisContent.getVersionSeriesCheckedOutBy()).isNull();
assertThat(cmisContent.getVersionSeriesCheckedOutId()).isNull();
assertThat(cmisContent.getVersionSeriesId()).isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId);
assertThat(cmisContent.isLatestMajorVersion()).isFalse();
assertThat(cmisContent.isLatestVersion()).isTrue();
assertThat(cmisContent.isMajorVersion()).isFalse();
// assertThat(cmisContent.isPrivateWorkingCopy()).isFalse();
assertThat(cmisContent.isVersionSeriesCheckedOut()).isFalse();
assertThat(cmisContent.getPropertyValue("metadata")).isEqualTo("contentMetadata");
return cmisContent;
}
private void _3_firstDocumentCheckOut()
throws IOException {
Document cmisContent = getSingleContentOf(zeRecord);
String privateWorkingCopyId = cmisContent.checkOut().getId();
assertThat(privateWorkingCopyId).isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_co");
//Therefore, until it is checked in (using the checkIn service), the PWC MUST NOT be considered
// the latest or latest major version in the version series. That is, the values of the
// cmis:isLatestVersion and cmis:isLatestMajorVersion properties MUST be FALSE.
cmisContent = getSingleContentOf(zeRecord);
assertThatContentStreamIsSameAs(cmisContent, docx1ContentStream(), docx1Hash);
assertThatVersionCreationInfoAre(cmisContent, bobId, firstDocumentModificationOClock);
assertThat(cmisContent.getId()).isEqualTo(privateWorkingCopyId);
assertThat(cmisContent.getProperty(PropertyIds.PARENT_ID).getValue()).isEqualTo(zeRecord);
assertThat(cmisContent.getVersionLabel()).isEqualTo("1.1");
assertThat(cmisContent.getVersionSeriesCheckedOutBy()).isEqualTo(aliceId);
assertThat(cmisContent.getVersionSeriesCheckedOutId()).isEqualTo(privateWorkingCopyId);
assertThat(cmisContent.getVersionSeriesId()).isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId);
assertThat(cmisContent.isLatestMajorVersion()).isFalse();
assertThat(cmisContent.isLatestVersion()).isFalse();
assertThat(cmisContent.isMajorVersion()).isFalse();
//assertThat(cmisContent.isPrivateWorkingCopy()).isTrue();
assertThat(cmisContent.isVersionSeriesCheckedOut()).isTrue();
assertThat(cmisContent.getPropertyValue("metadata")).isEqualTo("contentMetadata");
List<Document> allVersions = cmisContent.getAllVersions();
assertThat(allVersions).hasSize(3);
assertThatContentStreamIsSameAs(allVersions.get(0), docx1ContentStream(), docx1Hash);
assertThatVersionCreationInfoAre(allVersions.get(0), bobId, firstDocumentModificationOClock);
assertThat(allVersions.get(0).getId()).isEqualTo(privateWorkingCopyId);
assertThat(allVersions.get(0).getPropertyValue(PropertyIds.PARENT_ID)).isEqualTo(zeRecord);
assertThat(allVersions.get(0).getVersionLabel()).isEqualTo("1.1");
assertThat(allVersions.get(0).getVersionSeriesCheckedOutBy()).isEqualTo(aliceId);
assertThat(allVersions.get(0).getVersionSeriesCheckedOutId()).isEqualTo(privateWorkingCopyId);
assertThat(allVersions.get(0).getVersionSeriesId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId);
assertThat(allVersions.get(0).isLatestMajorVersion()).isFalse();
assertThat(allVersions.get(0).isLatestVersion()).isFalse();
assertThat(allVersions.get(0).isMajorVersion()).isFalse();
//assertThat(allVersions.get(0).isPrivateWorkingCopy()).isTrue();
assertThat(allVersions.get(0).isVersionSeriesCheckedOut()).isTrue();
assertThat(allVersions.get(0).getPropertyValue("metadata")).isEqualTo("contentMetadata");
assertThatContentStreamIsSameAs(allVersions.get(1), docx1ContentStream(), docx1Hash);
assertThatVersionCreationInfoAre(allVersions.get(1), bobId, firstDocumentModificationOClock);
assertThat(allVersions.get(1).getId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_1.1");
assertThat(allVersions.get(1).getPropertyValue(PropertyIds.PARENT_ID)).isEqualTo(zeRecord);
assertThat(allVersions.get(1).getVersionLabel()).isEqualTo("1.1");
assertThat(allVersions.get(1).getVersionSeriesCheckedOutBy()).isEqualTo(aliceId);
assertThat(allVersions.get(1).getVersionSeriesCheckedOutId()).isEqualTo(privateWorkingCopyId);
assertThat(allVersions.get(1).getVersionSeriesId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId);
assertThat(allVersions.get(1).isLatestMajorVersion()).isFalse();
assertThat(allVersions.get(1).isLatestVersion()).isTrue();
assertThat(allVersions.get(1).isMajorVersion()).isFalse();
//assertThat(allVersions.get(1).isPrivateWorkingCopy()).isFalse();
assertThat(allVersions.get(1).isVersionSeriesCheckedOut()).isTrue();
assertThat(allVersions.get(1).getPropertyValue("metadata")).isEqualTo("contentMetadata");
assertThat(allVersions.get(2).getVersionLabel()).isEqualTo("1.0");
assertThat(allVersions.get(2).getId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_1.0");
assertThat(allVersions.get(2).getPropertyValue(PropertyIds.PARENT_ID)).isEqualTo(zeRecord);
assertThat(allVersions.get(2).getVersionSeriesCheckedOutBy()).isEqualTo(aliceId);
assertThat(allVersions.get(2).getVersionSeriesCheckedOutId()).isEqualTo(privateWorkingCopyId);
assertThat(allVersions.get(2).getVersionSeriesId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId);
assertThat(allVersions.get(2).isLatestMajorVersion()).isTrue();
assertThat(allVersions.get(2).isLatestVersion()).isFalse();
assertThat(allVersions.get(2).isMajorVersion()).isTrue();
//assertThat(allVersions.get(2).isPrivateWorkingCopy()).isFalse();
assertThat(allVersions.get(2).isVersionSeriesCheckedOut()).isTrue();
assertThat(allVersions.get(2).getPropertyValue("metadata")).isEqualTo("contentMetadata");
assertThatVersionCreationInfoAre(allVersions.get(2), aliceId, documentCreationOClock);
assertThatContentStreamIsSameAs(allVersions.get(2), pdf1ContentStream(), pdf1Hash);
givenCurrentUserIsBob();
//Bob does not see the pvc version and cannot checkout
cmisContent = getSingleContentOf(zeRecord);
allVersions = cmisContent.getAllVersions();
assertThat(allVersions).hasSize(2);
assertThatContentStreamIsSameAs(allVersions.get(0), docx1ContentStream(), docx1Hash);
assertThatVersionCreationInfoAre(allVersions.get(0), bobId, firstDocumentModificationOClock);
assertThat(allVersions.get(0).getId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_1.1");
assertThat(allVersions.get(0).getPropertyValue(PropertyIds.PARENT_ID)).isEqualTo(zeRecord);
assertThat(allVersions.get(0).getVersionLabel()).isEqualTo("1.1");
assertThat(allVersions.get(0).getVersionSeriesCheckedOutBy()).isEqualTo(aliceId);
assertThat(allVersions.get(0).getVersionSeriesCheckedOutId()).isEqualTo(privateWorkingCopyId);
assertThat(allVersions.get(0).getVersionSeriesId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId);
assertThat(allVersions.get(0).isLatestMajorVersion()).isFalse();
assertThat(allVersions.get(0).isLatestVersion()).isTrue();
assertThat(allVersions.get(0).isMajorVersion()).isFalse();
//assertThat(allVersions.get(0).isPrivateWorkingCopy()).isFalse();
assertThat(allVersions.get(0).isVersionSeriesCheckedOut()).isTrue();
assertThat(allVersions.get(0).getPropertyValue("metadata")).isEqualTo("contentMetadata");
assertThatContentStreamIsSameAs(allVersions.get(1), pdf1ContentStream(), pdf1Hash);
assertThatVersionCreationInfoAre(allVersions.get(1), aliceId, documentCreationOClock);
assertThat(allVersions.get(1).getId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_1.0");
assertThat(allVersions.get(1).getPropertyValue(PropertyIds.PARENT_ID)).isEqualTo(zeRecord);
assertThat(allVersions.get(1).getVersionLabel()).isEqualTo("1.0");
assertThat(allVersions.get(1).getVersionSeriesCheckedOutBy()).isEqualTo(aliceId);
assertThat(allVersions.get(1).getVersionSeriesCheckedOutId()).isEqualTo(privateWorkingCopyId);
assertThat(allVersions.get(1).getVersionSeriesId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId);
assertThat(allVersions.get(1).isLatestMajorVersion()).isTrue();
assertThat(allVersions.get(1).isLatestVersion()).isFalse();
assertThat(allVersions.get(1).isMajorVersion()).isTrue();
//assertThat(allVersions.get(1).isPrivateWorkingCopy()).isFalse();
assertThat(allVersions.get(1).isVersionSeriesCheckedOut()).isTrue();
assertThat(allVersions.get(1).getPropertyValue("metadata")).isEqualTo("contentMetadata");
try {
cmisContent.checkOut();
fail("Bob was able to check out a document which is already checked out by alice");
} catch (Exception e) {
//OK
}
}
private void _4_firstDocumentCheckOutModification()
throws IOException {
Document cmisContent = getSingleContentOf(zeRecord);
String privateWorkingCopyId = cmisContent.setContentStream(pdf2ContentStream(), true, true).getId();
assertThat(privateWorkingCopyId).isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_co");
cmisContent = getSingleContentOf(zeRecord);
assertThat(privateWorkingCopyId).isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_co");
assertThat(cmisContent.getVersionLabel()).isEqualTo("1.2");
assertThatContentStreamIsSameAs(cmisContent, pdf2ContentStream(), pdf2Hash);
assertThatVersionCreationInfoAre(cmisContent, aliceId, firstDocumentCheckOutModificationOClock);
assertThat(cmisContent.getId()).isEqualTo(privateWorkingCopyId);
assertThat(cmisContent.getPropertyValue(PropertyIds.PARENT_ID)).isEqualTo(zeRecord);
assertThat(cmisContent.getVersionLabel()).isEqualTo("1.2");
assertThat(cmisContent.getVersionSeriesCheckedOutBy()).isEqualTo(aliceId);
assertThat(cmisContent.getVersionSeriesCheckedOutId()).isEqualTo(privateWorkingCopyId);
assertThat(cmisContent.getVersionSeriesId()).isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId);
assertThat(cmisContent.isLatestMajorVersion()).isFalse();
assertThat(cmisContent.isLatestVersion()).isFalse();
assertThat(cmisContent.isMajorVersion()).isFalse();
//assertThat(cmisContent.isPrivateWorkingCopy()).isFalse();
assertThat(cmisContent.isVersionSeriesCheckedOut()).isTrue();
assertThat(cmisContent.getPropertyValue("metadata")).isEqualTo("contentMetadata");
List<Document> allVersions = cmisContent.getAllVersions();
assertThat(allVersions).hasSize(3);
assertThatContentStreamIsSameAs(allVersions.get(0), pdf2ContentStream(), pdf2Hash);
assertThatVersionCreationInfoAre(allVersions.get(0), aliceId, firstDocumentCheckOutModificationOClock);
assertThat(allVersions.get(0).getId()).isEqualTo(privateWorkingCopyId);
assertThat(allVersions.get(0).getPropertyValue(PropertyIds.PARENT_ID)).isEqualTo(zeRecord);
assertThat(allVersions.get(0).getVersionLabel()).isEqualTo("1.2");
assertThat(allVersions.get(0).getVersionSeriesCheckedOutBy()).isEqualTo(aliceId);
assertThat(allVersions.get(0).getVersionSeriesCheckedOutId()).isEqualTo(privateWorkingCopyId);
assertThat(allVersions.get(0).getVersionSeriesId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId);
assertThat(allVersions.get(0).isLatestMajorVersion()).isFalse();
assertThat(allVersions.get(0).isLatestVersion()).isFalse();
assertThat(allVersions.get(0).isMajorVersion()).isFalse();
//assertThat(allVersions.get(0).isPrivateWorkingCopy()).isFalse();
assertThat(allVersions.get(0).isVersionSeriesCheckedOut()).isTrue();
assertThat(allVersions.get(0).getPropertyValue("metadata")).isEqualTo("contentMetadata");
assertThatContentStreamIsSameAs(allVersions.get(1), docx1ContentStream(), docx1Hash);
assertThatVersionCreationInfoAre(allVersions.get(1), bobId, firstDocumentModificationOClock);
assertThat(allVersions.get(1).getId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_1.1");
assertThat(allVersions.get(1).getPropertyValue(PropertyIds.PARENT_ID)).isEqualTo(zeRecord);
assertThat(allVersions.get(1).getVersionLabel()).isEqualTo("1.1");
assertThat(allVersions.get(1).getVersionSeriesCheckedOutBy()).isEqualTo(aliceId);
assertThat(allVersions.get(1).getVersionSeriesCheckedOutId()).isEqualTo(privateWorkingCopyId);
assertThat(allVersions.get(1).getVersionSeriesId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId);
assertThat(allVersions.get(1).isLatestMajorVersion()).isFalse();
assertThat(allVersions.get(1).isLatestVersion()).isTrue();
assertThat(allVersions.get(1).isMajorVersion()).isFalse();
//assertThat(allVersions.get(1).isPrivateWorkingCopy()).isFalse();
assertThat(allVersions.get(1).isVersionSeriesCheckedOut()).isTrue();
assertThat(allVersions.get(1).getPropertyValue("metadata")).isEqualTo("contentMetadata");
assertThatContentStreamIsSameAs(allVersions.get(2), pdf1ContentStream(), pdf1Hash);
assertThatVersionCreationInfoAre(allVersions.get(2), aliceId, documentCreationOClock);
assertThat(allVersions.get(2).getId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_1.0");
assertThat(allVersions.get(2).getPropertyValue(PropertyIds.PARENT_ID)).isEqualTo(zeRecord);
assertThat(allVersions.get(2).getVersionLabel()).isEqualTo("1.0");
assertThat(allVersions.get(2).getVersionSeriesCheckedOutBy()).isEqualTo(aliceId);
assertThat(allVersions.get(2).getVersionSeriesCheckedOutId()).isEqualTo(privateWorkingCopyId);
assertThat(allVersions.get(2).getVersionSeriesId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId);
assertThat(allVersions.get(2).isLatestMajorVersion()).isTrue();
assertThat(allVersions.get(2).isLatestVersion()).isFalse();
assertThat(allVersions.get(2).isMajorVersion()).isTrue();
//assertThat(allVersions.get(2).isPrivateWorkingCopy()).isFalse();
assertThat(allVersions.get(2).isVersionSeriesCheckedOut()).isTrue();
assertThat(allVersions.get(2).getPropertyValue("metadata")).isEqualTo("contentMetadata");
}
private void _5_firstDocumentCheckOutCheckIn()
throws IOException {
Document cmisContent = getSingleContentOf(zeRecord);
String versionId = cmisContent.checkIn(true, new HashMap<String, Object>(), null, null).getId();
assertThat(versionId).isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_2.0");
cmisContent = getSingleContentOf(zeRecord);
assertThatContentStreamIsSameAs(cmisContent, pdf2ContentStream(), pdf2Hash);
assertThatVersionCreationInfoAre(cmisContent, aliceId, firstDocumentCheckOutModificationOClock);
assertThat(cmisContent.getId()).isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_2.0");
assertThat(cmisContent.getPropertyValue(PropertyIds.PARENT_ID)).isEqualTo(zeRecord);
assertThat(cmisContent.getVersionLabel()).isEqualTo("2.0");
assertThat(cmisContent.getVersionSeriesCheckedOutBy()).isNull();
assertThat(cmisContent.getVersionSeriesCheckedOutId()).isNull();
assertThat(cmisContent.getVersionSeriesId()).isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId);
assertThat(cmisContent.isLatestMajorVersion()).isTrue();
assertThat(cmisContent.isLatestVersion()).isTrue();
assertThat(cmisContent.isMajorVersion()).isTrue();
//assertThat(cmisContent.isPrivateWorkingCopy()).isFalse();
assertThat(cmisContent.isVersionSeriesCheckedOut()).isFalse();
assertThat(cmisContent.getPropertyValue("metadata")).isEqualTo("contentMetadata");
List<Document> allVersions = cmisContent.getAllVersions();
assertThat(allVersions).hasSize(3);
assertThatContentStreamIsSameAs(allVersions.get(0), pdf2ContentStream(), pdf2Hash);
assertThatVersionCreationInfoAre(allVersions.get(0), aliceId, firstDocumentCheckOutModificationOClock);
assertThat(allVersions.get(0).getId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_2.0");
assertThat(allVersions.get(0).getPropertyValue(PropertyIds.PARENT_ID)).isEqualTo(zeRecord);
assertThat(allVersions.get(0).getVersionLabel()).isEqualTo("2.0");
assertThat(allVersions.get(0).getVersionSeriesCheckedOutBy()).isNull();
assertThat(allVersions.get(0).getVersionSeriesCheckedOutId()).isNull();
assertThat(allVersions.get(0).getVersionSeriesId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId);
assertThat(allVersions.get(0).isLatestMajorVersion()).isTrue();
assertThat(allVersions.get(0).isLatestVersion()).isTrue();
assertThat(allVersions.get(0).isMajorVersion()).isTrue();
//assertThat(allVersions.get(0).isPrivateWorkingCopy()).isFalse();
assertThat(allVersions.get(0).isVersionSeriesCheckedOut()).isFalse();
assertThat(allVersions.get(0).getPropertyValue("metadata")).isEqualTo("contentMetadata");
}
private void _6_secondDocumentCheckOut()
throws IOException {
Document cmisContent = getSingleContentOf(zeRecord);
String privateWorkingCopyId = cmisContent.checkOut().getId();
assertThat(privateWorkingCopyId).isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_co");
cmisContent = getSingleContentOf(zeRecord);
assertThatContentStreamIsSameAs(cmisContent, pdf2ContentStream(), pdf2Hash);
assertThatVersionCreationInfoAre(cmisContent, aliceId, firstDocumentCheckOutModificationOClock);
assertThat(cmisContent.getId()).isEqualTo(privateWorkingCopyId);
assertThat(cmisContent.getPropertyValue(PropertyIds.PARENT_ID)).isEqualTo(zeRecord);
assertThat(cmisContent.getVersionLabel()).isEqualTo("2.0");
assertThat(cmisContent.getVersionSeriesCheckedOutBy()).isEqualTo(bobId);
assertThat(cmisContent.getVersionSeriesCheckedOutId()).isEqualTo(privateWorkingCopyId);
assertThat(cmisContent.getVersionSeriesId()).isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId);
assertThat(cmisContent.isLatestMajorVersion()).isFalse();
assertThat(cmisContent.isLatestVersion()).isFalse();
assertThat(cmisContent.isMajorVersion()).isFalse();
//assertThat(cmisContent.isPrivateWorkingCopy()).isTrue();
assertThat(cmisContent.isVersionSeriesCheckedOut()).isTrue();
assertThat(cmisContent.getPropertyValue("metadata")).isEqualTo("contentMetadata");
}
private void _7_secondDocumentCheckOutCheckInWithContentOClock()
throws IOException {
Document cmisContent = getSingleContentOf(zeRecord);
String versionId = cmisContent.checkIn(false, new HashMap<String, Object>(), docx2ContentStream(), null)
.getId();
assertThat(versionId).isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_2.1");
cmisContent = getSingleContentOf(zeRecord);
assertThatVersionCreationInfoAre(cmisContent, bobId, secondDocumentCheckOutCheckInWithContentOClock);
assertThat(cmisContent.getId()).isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_2.1");
assertThat(cmisContent.getPropertyValue(PropertyIds.PARENT_ID)).isEqualTo(zeRecord);
assertThat(cmisContent.getVersionLabel()).isEqualTo("2.1");
assertThat(cmisContent.getVersionSeriesCheckedOutBy()).isNull();
assertThat(cmisContent.getVersionSeriesCheckedOutId()).isNull();
assertThat(cmisContent.getVersionSeriesId()).isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId);
assertThat(cmisContent.isLatestMajorVersion()).isFalse();
assertThat(cmisContent.isLatestVersion()).isTrue();
assertThat(cmisContent.isMajorVersion()).isFalse();
//assertThat(cmisContent.isPrivateWorkingCopy()).isFalse();
assertThat(cmisContent.isVersionSeriesCheckedOut()).isFalse();
assertThat(cmisContent.getPropertyValue("metadata")).isEqualTo("contentMetadata");
assertThatContentStreamIsSameAs(cmisContent, docx2ContentStream(), docx2Hash);
List<Document> allVersions = cmisContent.getAllVersions();
assertThat(allVersions).hasSize(4);
assertThatContentStreamIsSameAs(allVersions.get(0), docx2ContentStream(), docx2Hash);
assertThatVersionCreationInfoAre(allVersions.get(0), bobId, secondDocumentCheckOutCheckInWithContentOClock);
assertThat(allVersions.get(0).getId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_2.1");
assertThat(allVersions.get(0).getPropertyValue(PropertyIds.PARENT_ID)).isEqualTo(zeRecord);
assertThat(allVersions.get(0).getVersionLabel()).isEqualTo("2.1");
assertThat(allVersions.get(0).getVersionSeriesCheckedOutBy()).isNull();
assertThat(allVersions.get(0).getVersionSeriesCheckedOutId()).isNull();
assertThat(allVersions.get(0).getVersionSeriesId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId);
assertThat(allVersions.get(0).isLatestMajorVersion()).isFalse();
assertThat(allVersions.get(0).isLatestVersion()).isTrue();
assertThat(allVersions.get(0).isMajorVersion()).isFalse();
//assertThat(allVersions.get(0).isPrivateWorkingCopy()).isFalse();
assertThat(allVersions.get(0).isVersionSeriesCheckedOut()).isFalse();
assertThat(allVersions.get(0).getPropertyValue("metadata")).isEqualTo("contentMetadata");
assertThatVersionCreationInfoAre(allVersions.get(1), aliceId, firstDocumentCheckOutModificationOClock);
assertThat(allVersions.get(1).getId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_2.0");
assertThat(allVersions.get(1).getPropertyValue(PropertyIds.PARENT_ID)).isEqualTo(zeRecord);
assertThat(allVersions.get(1).getVersionLabel()).isEqualTo("2.0");
assertThat(allVersions.get(1).getVersionSeriesCheckedOutBy()).isNull();
assertThat(allVersions.get(1).getVersionSeriesCheckedOutId()).isNull();
assertThat(allVersions.get(1).getVersionSeriesId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId);
assertThat(allVersions.get(1).isLatestMajorVersion()).isTrue();
assertThat(allVersions.get(1).isLatestVersion()).isFalse();
assertThat(allVersions.get(1).isMajorVersion()).isTrue();
//assertThat(allVersions.get(1).isPrivateWorkingCopy()).isFalse();
assertThat(allVersions.get(1).isVersionSeriesCheckedOut()).isFalse();
assertThat(allVersions.get(1).getPropertyValue("metadata")).isEqualTo("contentMetadata");
assertThatContentStreamIsSameAs(allVersions.get(1), pdf2ContentStream(), pdf2Hash);
assertThat(allVersions.get(2).getId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_1.1");
assertThat(allVersions.get(3).getId())
.isEqualTo("content_" + zeRecord + "_contentMetadata_" + zeRecordContentId + "_1.0");
}
private void _8_replaceContentOClock(Folder folder)
throws IOException {
Map<String, Object> properties = new HashMap<>();
properties.put("metadata", "contentMetadata");
properties.put(PropertyIds.OBJECT_TYPE_ID, "cmis:document");
folder.createDocument(properties, pdf2ContentStream(), VersioningState.MAJOR);
Document cmisContent = getSingleContentOf(zeRecord);
assertThatContentStreamIsSameAs(cmisContent, pdf2ContentStream(), pdf2Hash);
assertThatVersionCreationInfoAre(cmisContent, aliceId, replaceContentOClock);
assertThat(cmisContent.getId()).startsWith("content_" + zeRecord + "_contentMetadata_");
assertThat(cmisContent.getId()).endsWith("_1.0");
assertThat(cmisContent.getId()).doesNotContain(zeRecordContentId);
assertThat(cmisContent.getPropertyValue(PropertyIds.PARENT_ID)).isEqualTo(zeRecord);
assertThat(cmisContent.getVersionLabel()).isEqualTo("1.0");
assertThat(cmisContent.getVersionSeriesCheckedOutBy()).isNull();
assertThat(cmisContent.getVersionSeriesCheckedOutId()).isNull();
assertThat(cmisContent.getVersionSeriesId()).startsWith("content_" + zeRecord + "_contentMetadata_");
assertThat(cmisContent.getVersionSeriesId()).doesNotContain(zeRecordContentId);
assertThat(cmisContent.isLatestMajorVersion()).isTrue();
assertThat(cmisContent.isLatestVersion()).isTrue();
assertThat(cmisContent.isMajorVersion()).isTrue();
//assertThat(cmisContent.isPrivateWorkingCopy()).isFalse();
assertThat(cmisContent.isVersionSeriesCheckedOut()).isFalse();
assertThat(cmisContent.getPropertyValue("metadata")).isEqualTo("contentMetadata");
assertThat(cmisContent.getAllVersions()).hasSize(1);
}
private void _9_deleteContentOClock() {
Document cmisContent = getSingleContentOf(zeRecord);
cmisContent.deleteAllVersions();
assertThat(getContentsOf(zeRecord)).isEmpty();
}
private ContentStream pdf1ContentStream()
throws IOException {
String filename = "pdf1.pdf";
BigInteger length = BigInteger.valueOf(pdf1Length);
String mimetype = PDF_MIMETYPE;
InputStream stream = getTestResourceInputStreamFactory("pdf1.pdf").create(SDK_STREAM);
return new ContentStreamImpl(filename, length, mimetype, stream);
}
private ContentStream pdf2ContentStream()
throws IOException {
String filename = "pdf2.pdf";
BigInteger length = BigInteger.valueOf(pdf2Length);
String mimetype = PDF_MIMETYPE;
InputStream stream = getTestResourceInputStreamFactory("pdf2.pdf").create(SDK_STREAM);
return new ContentStreamImpl(filename, length, mimetype, stream);
}
private ContentStream docx1ContentStream()
throws IOException {
String filename = "docx1.docx";
BigInteger length = BigInteger.valueOf(docx1Length);
String mimetype = DOCX_MIMETYPE;
InputStream stream = getTestResourceInputStreamFactory("docx1.docx").create(SDK_STREAM);
return new ContentStreamImpl(filename, length, mimetype, stream);
}
private ContentStream docx2ContentStream()
throws IOException {
String filename = "docx2.docx";
BigInteger length = BigInteger.valueOf(docx2Length);
String mimetype = DOCX_MIMETYPE;
InputStream stream = getTestResourceInputStreamFactory("docx2.docx").create(SDK_STREAM);
return new ContentStreamImpl(filename, length, mimetype, stream);
}
private void givenCurrentUserIsAlice() {
session = sessionFor(alice);
}
private void givenCurrentUserIsBob() {
session = sessionFor(bob);
}
private void assertThatVersionCreationInfoAre(Document document, String userId, LocalDateTime dateTime) {
assertThat(document.getCreationDate().getTime()).isEqualToIgnoringMillis(dateTime.toDate());
assertThat(document.getCreatedBy()).isEqualTo(userId);
assertThat(document.getLastModificationDate().getTime()).isEqualToIgnoringMillis(dateTime.toDate());
assertThat(document.getLastModifiedBy()).isEqualTo(userId);
}
private void assertThatContentStreamIsSameAs(Document document, ContentStream stream, String hash) {
ContentStream contentStream = document.getContentStream();
assertThat(contentStream.getMimeType()).isEqualTo(stream.getMimeType()); // OK
assertThat(contentStream.getFileName()).isEqualTo(stream.getFileName()); // OK
assertThat(document.getContentStreamLength()).isEqualTo(stream.getLength());
// ContentStream lenghts are accessible in the document, not needed in the stream itself.
assertThat(contentStream.getBigLength()).isNull();
assertThat(contentStream.getLength()).isEqualTo(-1);
assertThat(contentStream.getStream()).hasContentEqualTo(stream.getStream()); // OK
// All of those are MISSING
assertThat(document.getContentStreamId()).isEqualTo(hash);
assertThat(document.getContentStreamFileName()).isEqualTo(stream.getFileName());
assertThat(document.getContentStreamLength()).isEqualTo(stream.getLength());
assertThat(document.getContentStreamMimeType()).isEqualTo(stream.getMimeType());
}
private Document getSingleContentOf(String id) {
List<Document> contents = getContentsOf(id);
assertThat(contents).hasSize(1);
return contents.get(0);
}
private List<Document> getContentsOf(String id) {
List<Document> objectList = new ArrayList<>();
Folder folder = (Folder) session.getObject(id);
Iterator<CmisObject> iterator = folder.getChildren().iterator();
while (iterator.hasNext()) {
CmisObject object = iterator.next();
if (object instanceof Document) {
objectList.add((Document) object);
}
}
return objectList;
}
private String givenRecord()
throws RecordServicesException {
Record record = new TestRecord(zeSchema, "zeRecord");
recordServices.add(record);
return record.getId();
}
private Session sessionFor(User user) {
UserCredential userCredential = getModelLayerFactory().newUserServices().getUserCredential(user.getUsername());
currentUserId = user.getUsername();
String token = user.getUsername().equals("alice") ? aliceToken : bobToken;
return newCmisSessionBuilder().authenticatedBy(userCredential.getServiceKey(), token).onCollection(zeCollection).build();
}
}