blob: 652da2a269ed59943b827a73daec2a022b19a733 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.chemistry.opencmis.inmemory;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.data.ObjectData;
import org.apache.chemistry.opencmis.commons.data.ObjectInFolderContainer;
import org.apache.chemistry.opencmis.commons.data.ObjectInFolderData;
import org.apache.chemistry.opencmis.commons.data.ObjectInFolderList;
import org.apache.chemistry.opencmis.commons.data.ObjectList;
import org.apache.chemistry.opencmis.commons.data.ObjectParentData;
import org.apache.chemistry.opencmis.commons.data.Properties;
import org.apache.chemistry.opencmis.commons.data.PropertyData;
import org.apache.chemistry.opencmis.commons.enums.BaseTypeId;
import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
import org.apache.chemistry.opencmis.commons.enums.RelationshipDirection;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import org.apache.chemistry.opencmis.commons.exceptions.CmisConstraintException;
import org.apache.chemistry.opencmis.commons.exceptions.CmisInvalidArgumentException;
import org.apache.chemistry.opencmis.commons.spi.Holder;
import org.apache.chemistry.opencmis.inmemory.ObjectServiceTest.ObjectTestTypeSystemCreator;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class RelationshipServiceTest extends AbstractServiceTest {
private static final Logger log = LoggerFactory.getLogger(ObjectServiceTest.class);
private static final String MY_DOC_1 = "SourceDocument_1";
private static final String MY_DOC_2 = "SourceDocument_2";
private static final String MY_DOC_3 = "SourceDocument_3";
private static final String MY_DOC_4 = "SourceDocument_4";
private static final String MY_DOC_TARGET = "TargetDocument";
private static final String REL_CUSTOM_PROP_VALUE = "Simple Cross Reference";
ObjectCreator fCreator;
String docId1;
String docId2;
String docId3;
String docId4;
String targetId;
@Override
@Before
public void setUp() {
super.setTypeCreatorClass(ObjectTestTypeSystemCreator.class.getName());
super.setUp();
fCreator = new ObjectCreator(fFactory, fObjSvc, fRepositoryId);
// create test data
docId1 = createDocument(MY_DOC_1, fRootFolderId, BaseTypeId.CMIS_DOCUMENT.value(), false);
docId2 = createDocument(MY_DOC_2, fRootFolderId, BaseTypeId.CMIS_DOCUMENT.value(), true);
targetId = createDocument(MY_DOC_TARGET, fRootFolderId, BaseTypeId.CMIS_DOCUMENT.value(), false);
}
@Override
@After
public void tearDown() {
super.tearDown();
}
@Test
public void testCreateGetRelationship() {
log.info("starting testCreateRelationship() ...");
List<PropertyData<?>> relProps1 = createRelationshipProperties(REL_CUSTOM_PROP_VALUE);
final String id1 = createRelationship("CrossReference1", ObjectServiceTest.TEST_RELATION_TYPE_ID, docId1,
targetId, relProps1);
assertNotNull(id1);
List<PropertyData<?>> relProps2 = createRelationshipProperties(REL_CUSTOM_PROP_VALUE);
final String id2 = createRelationship("CrossReference2", ObjectServiceTest.TEST_RELATION_TYPE_ID, docId2,
targetId, relProps2);
if (id2 != null) {
log.info("createRelationship succeeded with created id: " + id2);
}
assertNotNull(id2);
List<String> relIds = new ArrayList<String>() {
{
add(id1);
add(id2);
}
};
// Get the relationships back
// source
ObjectList objectList = fRelSvc.getObjectRelationships(REPOSITORY_ID, targetId, false,
RelationshipDirection.TARGET, ObjectServiceTest.TEST_RELATION_TYPE_ID, null, null, null, null, null);
assertEquals(2, objectList.getNumItems().longValue());
List<ObjectData> objectDataList = objectList.getObjects();
List<String> ids = new ArrayList<String>(relIds);
for (ObjectData objectData : objectDataList) {
verifyRelation(objectData, ids, ObjectServiceTest.TEST_RELATION_TYPE_ID, targetId,
RelationshipDirection.TARGET);
}
assertTrue(ids.isEmpty());
// target
objectList = fRelSvc.getObjectRelationships(REPOSITORY_ID, docId1, false, RelationshipDirection.SOURCE,
ObjectServiceTest.TEST_RELATION_TYPE_ID, null, null, null, null, null);
assertEquals(1, objectList.getNumItems().longValue());
ObjectData objectData = objectList.getObjects().get(0);
ids = new ArrayList<String>(Collections.singletonList(id1));
verifyRelation(objectData, ids, ObjectServiceTest.TEST_RELATION_TYPE_ID, docId1, RelationshipDirection.SOURCE);
assertTrue(ids.isEmpty());
// both
ids = new ArrayList<String>(relIds);
objectList = fRelSvc.getObjectRelationships(REPOSITORY_ID, targetId, false, RelationshipDirection.EITHER,
ObjectServiceTest.TEST_RELATION_TYPE_ID, null, null, null, null, null);
assertEquals(2, objectList.getNumItems().longValue());
objectDataList = objectList.getObjects();
ids = new ArrayList<String>(relIds);
for (ObjectData od : objectDataList) {
verifyRelation(od, ids, ObjectServiceTest.TEST_RELATION_TYPE_ID, targetId, RelationshipDirection.EITHER);
}
assertTrue(ids.isEmpty());
log.info("... testCreateRelationship() finished.");
}
@Test
public void testRelationToFolder() {
// test create with a folder as source
String folderId = createFolder("folder1", fRootFolderId, BaseTypeId.CMIS_FOLDER.value());
List<PropertyData<?>> relProps = createRelationshipProperties(REL_CUSTOM_PROP_VALUE);
final String id = createRelationship("CrossReference3", ObjectServiceTest.TEST_RELATION_TYPE_ID, folderId,
targetId, relProps);
assertNotNull(id);
ObjectList objectList = fRelSvc.getObjectRelationships(REPOSITORY_ID, folderId, false,
RelationshipDirection.SOURCE, ObjectServiceTest.TEST_RELATION_TYPE_ID, null, null, null, null, null);
assertEquals(1, objectList.getNumItems().longValue());
ObjectData objectData = objectList.getObjects().get(0);
ArrayList<String> ids = new ArrayList<String>(Collections.singletonList(id));
verifyRelation(objectData, ids, ObjectServiceTest.TEST_RELATION_TYPE_ID, folderId, RelationshipDirection.SOURCE);
assertTrue(ids.isEmpty());
}
@Test
public void testCreateIllegalTypes() {
// test create a relationship with a folder type, should fail:
try {
createRelationship("CrossReference1", BaseTypeId.CMIS_FOLDER.value(), docId1, docId2, null);
fail("Creating document with a folder type should fail.");
} catch (CmisInvalidArgumentException e) {
log.info("Creating a relationship with a folder type failed as expected.");
} catch (Exception e) {
fail("Creating a relationship with a folder type should fail with a CmisInvalidArgumentException, but was: "
+ e);
}
}
@Test
public void getRelationshipSubTypes() {
log.info("starting testCreateRelationship() ...");
final String id1 = createRelationship("CrossReference1", BaseTypeId.CMIS_RELATIONSHIP.value(), docId1,
targetId, null);
assertNotNull(id1);
final String id2 = createRelationship("CrossReference2", ObjectServiceTest.TEST_RELATION_TYPE_ID, docId2,
targetId, null);
if (id2 != null) {
log.info("createRelationship succeeded with created id: " + id2);
}
assertNotNull(id2);
List<String> relIds = new ArrayList<String>() {
{
add(id1);
add(id2);
}
};
// Get the relationships back
ObjectList objectList = fRelSvc.getObjectRelationships(REPOSITORY_ID, targetId, false,
RelationshipDirection.TARGET, BaseTypeId.CMIS_RELATIONSHIP.value(), null, null, null, null, null);
assertEquals(1, objectList.getNumItems().longValue());
List<ObjectData> objectDataList = objectList.getObjects();
List<String> ids = new ArrayList<String>(Collections.singletonList(id1));
verifyRelation(objectDataList.get(0), ids, BaseTypeId.CMIS_RELATIONSHIP.value(), targetId,
RelationshipDirection.TARGET);
assertTrue(ids.isEmpty());
objectList = fRelSvc.getObjectRelationships(REPOSITORY_ID, targetId, true, RelationshipDirection.TARGET,
BaseTypeId.CMIS_RELATIONSHIP.value(), null, null, null, null, null);
assertEquals(2, objectList.getNumItems().longValue());
objectDataList = objectList.getObjects();
ids = new ArrayList<String>(relIds);
for (ObjectData objectData : objectDataList) {
verifyRelation(objectData, ids, null, targetId, RelationshipDirection.TARGET);
}
assertTrue(ids.isEmpty());
// Test the same with passing null for the type id
objectList = fRelSvc.getObjectRelationships(REPOSITORY_ID, targetId, true, RelationshipDirection.TARGET, null,
null, null, null, null, null);
assertEquals(2, objectList.getNumItems().longValue());
objectDataList = objectList.getObjects();
ids = new ArrayList<String>(relIds);
for (ObjectData objectData : objectDataList) {
verifyRelation(objectData, ids, null, targetId, RelationshipDirection.TARGET);
}
assertTrue(ids.isEmpty());
}
@Test
public void testAllowedTypes() {
String docSub1 = createDocument("CustomDoc1", fRootFolderId, ObjectServiceTest.TEST_CUSTOM_DOCUMENT_TYPE_ID,
false);
String docSub2 = createDocument("CustomDoc2", fRootFolderId, ObjectServiceTest.TEST_CUSTOM_DOCUMENT_TYPE_ID,
false);
try {
createRelationship(fRootFolderId, ObjectServiceTest.TEST_RESTRICTED_RELATION_TYPE_ID, docId1, targetId,
null);
fail("Creating a relationship with a type cmis:document as source should fail, not an allowedSourceType.");
} catch (Exception e) {
assertTrue(e instanceof CmisConstraintException);
log.info("Creating document with a folder as source and target failed as expected due to alledSourceType restriction.");
}
try {
createRelationship(fRootFolderId, ObjectServiceTest.TEST_RESTRICTED_RELATION_TYPE_ID, docSub1, targetId,
null);
fail("Creating a relationship with a type cmis:document as target should fail, not an allowedSourceType.");
} catch (Exception e) {
assertTrue(e instanceof CmisConstraintException);
log.info("Creating document with a folder as source failed as expected due to alledSourceType restriction.");
}
try {
createRelationship(fRootFolderId, ObjectServiceTest.TEST_RESTRICTED_RELATION_TYPE_ID, docId1, docSub1, null);
fail("Creating a relationship with a type cmis:document as source should fail, not an allowedSourceType.");
} catch (Exception e) {
assertTrue(e instanceof CmisConstraintException);
log.info("Creating document with a folder as source failed as expected due to alledSourceType restriction.");
}
try {
String id = createRelationship(fRootFolderId, ObjectServiceTest.TEST_RESTRICTED_RELATION_TYPE_ID, docSub1,
docSub2, null);
assertNotNull(id);
} catch (Exception e) {
fail("Creating a relationship with an allowed type as source and target should succeed.");
}
}
@Test
public void testGetObject() {
final String id1 = createRelationship("CrossReference1", BaseTypeId.CMIS_RELATIONSHIP.value(), docId1,
targetId, null);
assertNotNull(id1);
final String id2 = createRelationship("CrossReference2", BaseTypeId.CMIS_RELATIONSHIP.value(), docId2,
targetId, null);
assertNotNull(id1);
List<String> relIds = new ArrayList<String>() {
{
add(id1);
add(id2);
}
};
// get document object, source
ObjectData objectData = fObjSvc.getObject(fRepositoryId, docId1, null, false, IncludeRelationships.SOURCE,
null, false, false, null);
List<ObjectData> odRelationships = objectData.getRelationships();
assertEquals(1, odRelationships.size());
List<String> ids = new ArrayList<String>(Collections.singletonList(id1));
for (ObjectData objectDataRel : odRelationships) {
verifyRelation(objectDataRel, ids, null, docId1, RelationshipDirection.SOURCE);
}
assertTrue(ids.isEmpty());
// get document object, target
objectData = fObjSvc.getObject(fRepositoryId, targetId, null, false, IncludeRelationships.TARGET, null, false,
false, null);
odRelationships = objectData.getRelationships();
assertEquals(2, odRelationships.size());
ids = new ArrayList<String>(relIds);
for (ObjectData objectDataRel : odRelationships) {
verifyRelation(objectDataRel, ids, null, targetId, RelationshipDirection.TARGET);
}
assertTrue(ids.isEmpty());
// get document object, BOTH
objectData = fObjSvc.getObject(fRepositoryId, targetId, null, false, IncludeRelationships.BOTH, null, false,
false, null);
odRelationships = objectData.getRelationships();
assertEquals(2, odRelationships.size());
ids = new ArrayList<String>(relIds);
for (ObjectData objectDataRel : odRelationships) {
verifyRelation(objectDataRel, ids, null, targetId, RelationshipDirection.EITHER);
}
assertTrue(ids.isEmpty());
// get document object, none
objectData = fObjSvc.getObject(fRepositoryId, targetId, null, false, IncludeRelationships.NONE, null, false,
false, null);
assertTrue(objectData.getRelationships().isEmpty());
// Folder
String folderId = createFolder("folder1", fRootFolderId, BaseTypeId.CMIS_FOLDER.value());
String id = createRelationship("FolderRelationship", ObjectServiceTest.TEST_RELATION_TYPE_ID, folderId,
targetId, null);
assertNotNull(id);
objectData = fObjSvc.getObject(fRepositoryId, folderId, null, false, IncludeRelationships.SOURCE, null, false,
false, null);
odRelationships = objectData.getRelationships();
assertEquals(1, odRelationships.size());
ids = new ArrayList<String>(Collections.singletonList(id));
for (ObjectData objectDataRel : odRelationships) {
verifyRelation(objectDataRel, ids, null, folderId, RelationshipDirection.SOURCE);
}
assertTrue(ids.isEmpty());
// Versioned document
String verId = createVersionedDocument();
id = createRelationship("VersionRelationship", ObjectServiceTest.TEST_RELATION_TYPE_ID, verId, targetId, null);
assertNotNull(id);
objectData = fObjSvc.getObject(fRepositoryId, verId, null, false, IncludeRelationships.SOURCE, null, false,
false, null);
odRelationships = objectData.getRelationships();
assertEquals(1, odRelationships.size());
ids = new ArrayList<String>(Collections.singletonList(id));
for (ObjectData objectDataRel : odRelationships) {
verifyRelation(objectDataRel, ids, null, verId, RelationshipDirection.SOURCE);
}
assertTrue(ids.isEmpty());
// item
String itemId = createItem();
id = createRelationship("ItemRelationship", ObjectServiceTest.TEST_RELATION_TYPE_ID, itemId, targetId, null);
assertNotNull(id);
objectData = fObjSvc.getObject(fRepositoryId, itemId, null, false, IncludeRelationships.SOURCE, null, false,
false, null);
odRelationships = objectData.getRelationships();
assertEquals(1, odRelationships.size());
ids = new ArrayList<String>(Collections.singletonList(id));
for (ObjectData objectDataRel : odRelationships) {
verifyRelation(objectDataRel, ids, null, itemId, RelationshipDirection.SOURCE);
}
assertTrue(ids.isEmpty());
}
@Test
public void testGetObjetByPath() {
// getObjectByPath
final String id1 = createRelationship("CrossReference1", BaseTypeId.CMIS_RELATIONSHIP.value(), docId1,
targetId, null);
assertNotNull(id1);
ObjectData objectData = fObjSvc.getObjectByPath(fRepositoryId, "/" + MY_DOC_1, null, null,
IncludeRelationships.SOURCE, null, false, false, null);
List<ObjectData> odRelationships = objectData.getRelationships();
assertEquals(1, odRelationships.size());
List<String> ids = new ArrayList<String>(Collections.singletonList(id1));
for (ObjectData objectDataRel : odRelationships) {
verifyRelation(objectDataRel, ids, null, docId1, RelationshipDirection.SOURCE);
}
assertTrue(ids.isEmpty());
}
@Test
public void testGetCheckedOut() {
// getObjectByPath
final String did = createCheckedOutDocument();
assertNotNull(did);
final String id1 = createRelationship("CrossReference1", ObjectServiceTest.TEST_RELATION_TYPE_ID, did,
targetId, null);
ObjectList objectList = fNavSvc.getCheckedOutDocs(fRepositoryId, fRootFolderId, null, null, false,
IncludeRelationships.BOTH, null, null, null, null);
assertEquals(1, objectList.getNumItems().intValue());
List<ObjectData> odRelationships = objectList.getObjects().get(0).getRelationships();
assertEquals(1, odRelationships.size());
List<String> ids = new ArrayList<String>(Collections.singletonList(id1));
for (ObjectData objectDataRel : odRelationships) {
verifyRelation(objectDataRel, ids, null, did, RelationshipDirection.EITHER);
}
assertTrue(ids.isEmpty());
}
@Test
public void testGetDescendants() {
boolean found1 = false;
boolean found2 = false;
boolean found3 = false;
boolean found4 = false;
boolean found5 = false;
createHierarchy();
final String id1 = createRelationship("CrossReference1", ObjectServiceTest.TEST_RELATION_TYPE_ID, docId1,
targetId, null);
assertNotNull(id1);
final String id2 = createRelationship("CrossReference2", ObjectServiceTest.TEST_RELATION_TYPE_ID, docId2,
targetId, null);
assertNotNull(id2);
final String id3 = createRelationship("CrossReference3", ObjectServiceTest.TEST_RELATION_TYPE_ID, docId3,
targetId, null);
assertNotNull(id3);
final String id4 = createRelationship("CrossReference4", ObjectServiceTest.TEST_RELATION_TYPE_ID, docId4,
targetId, null);
assertNotNull(id4);
List<ObjectInFolderContainer> ofcs = fNavSvc.getDescendants(fRepositoryId, fRootFolderId,
BigInteger.valueOf(-1), null, false, IncludeRelationships.BOTH, null, false, null);
Map<String, List<ObjectData>> relMap = new HashMap<String, List<ObjectData>>();
getRelationshipsOfDescendants(ofcs, relMap);
assertEquals(5, relMap.size());
for (Entry<String, List<ObjectData>> relEntry : relMap.entrySet()) {
List<ObjectData> rels = relEntry.getValue();
String srcId = relEntry.getKey();
if (srcId.equals(docId1)) {
assertEquals(1, rels.size());
assertEquals(id1, rels.get(0).getId());
found1 = true;
} else if (srcId.equals(docId2)) {
assertEquals(1, rels.size());
assertEquals(id2, rels.get(0).getId());
found2 = true;
} else if (srcId.equals(docId3)) {
assertEquals(1, rels.size());
assertEquals(id3, rels.get(0).getId());
found3 = true;
} else if (srcId.equals(docId4)) {
assertEquals(1, rels.size());
assertEquals(id4, rels.get(0).getId());
found4 = true;
} else if (srcId.equals(targetId)) {
assertEquals(4, rels.size());
found5 = true;
}
}
assertTrue(found1 && found2 && found3 && found4 && found5);
}
@Test
public void testGetChildren() {
final String id1 = createRelationship("CrossReference1", BaseTypeId.CMIS_RELATIONSHIP.value(), docId1,
targetId, null);
assertNotNull(id1);
final String id2 = createRelationship("CrossReference1", BaseTypeId.CMIS_RELATIONSHIP.value(), docId2,
targetId, null);
assertNotNull(id2);
ObjectInFolderList ods = fNavSvc.getChildren(fRepositoryId, fRootFolderId, null, null, false,
IncludeRelationships.SOURCE, null, false, null, null, null);
assertEquals(3, ods.getNumItems().intValue());
for (ObjectInFolderData of : ods.getObjects()) {
String id = of.getObject().getId();
List<ObjectData> rels = of.getObject().getRelationships();
if (id.equals(docId1)) {
assertEquals(1, rels.size());
ArrayList<String> ids = new ArrayList<String>(Collections.singletonList(id1));
verifyRelation(rels.get(0), ids, null, docId1, RelationshipDirection.SOURCE);
assertTrue(ids.isEmpty());
} else if (id.equals(docId2)) {
assertEquals(1, rels.size());
ArrayList<String> ids = new ArrayList<String>(Collections.singletonList(id2));
verifyRelation(rels.get(0), ids, null, docId2, RelationshipDirection.SOURCE);
assertTrue(ids.isEmpty());
} else if (id.equals(targetId)) {
assertEquals(0, rels.size());
} else {
fail("Unexpected object in getChildren");
}
}
}
@Test
public void testGetParents() {
final String id1 = createRelationship("CrossReference1", ObjectServiceTest.TEST_RELATION_TYPE_ID, docId1,
fRootFolderId, null);
assertNotNull(id1);
final String id2 = createRelationship("CrossReference2", ObjectServiceTest.TEST_RELATION_TYPE_ID, docId2,
fRootFolderId, null);
List<ObjectParentData> ods = fNavSvc.getObjectParents(fRepositoryId, docId1, null, false,
IncludeRelationships.TARGET, null, false, null);
assertEquals(1, ods.size());
List<ObjectData> rels = ods.get(0).getObject().getRelationships();
assertEquals(2, rels.size());
List<String> relIds = new ArrayList<String>() {
{
add(id1);
add(id2);
}
};
for (ObjectData rel : rels) {
verifyRelation(rel, relIds, null, fRootFolderId, RelationshipDirection.TARGET);
}
assertTrue(relIds.isEmpty());
}
@Test
public void testQueryIncludeRelationships() {
final String id1 = createRelationship("CrossReference1", ObjectServiceTest.TEST_RELATION_TYPE_ID, docId1,
targetId, null);
assertNotNull(id1);
final String id2 = createRelationship("CrossReference2", ObjectServiceTest.TEST_RELATION_TYPE_ID, docId2,
targetId, null);
String statement = "SELECT * from cmis:document WHERE cmis:name = '" + MY_DOC_1 + "'";
ObjectList res = fDiscSvc.query(fRepositoryId, statement, false, false, IncludeRelationships.SOURCE, null,
null, null, null);
assertEquals(1, res.getNumItems().intValue());
List<ObjectData> rels = res.getObjects().get(0).getRelationships();
assertEquals(1, rels.size());
ArrayList<String> ids = new ArrayList<String>(Collections.singletonList(id1));
verifyRelation(rels.get(0), ids, null, docId1, RelationshipDirection.SOURCE);
assertTrue(ids.isEmpty());
}
@Test
public void testQueryRelationships() {
final String id1 = createRelationship("CrossReference1", ObjectServiceTest.TEST_RELATION_TYPE_ID, docId1,
targetId, null);
assertNotNull(id1);
final String id2 = createRelationship("CrossReference2", ObjectServiceTest.TEST_RELATION_TYPE_ID, docId2,
targetId, null);
String statement = "SELECT * from cmis:relationship WHERE " + PropertyIds.TARGET_ID + " = '" + targetId + "'";
ObjectList res = fDiscSvc.query(fRepositoryId, statement, false, false, IncludeRelationships.NONE, null, null,
null, null);
assertEquals(2, res.getNumItems().intValue());
ArrayList<String> ids = new ArrayList<String>() {
{
add(id1);
add(id2);
}
};
for (ObjectData od : res.getObjects()) {
ids.remove(od.getId());
}
assertTrue(ids.isEmpty());
}
private void verifyRelation(ObjectData objectData, List<String> expectedRelIds, String expectedTypeId,
String refId, RelationshipDirection direction) {
String relId = (String) objectData.getProperties().getProperties().get(PropertyIds.OBJECT_ID).getFirstValue();
assertTrue(expectedRelIds.remove(relId));
assertEquals(BaseTypeId.CMIS_RELATIONSHIP, objectData.getBaseTypeId());
if (null != expectedTypeId) {
assertEquals(expectedTypeId, objectData.getProperties().getProperties().get(PropertyIds.OBJECT_TYPE_ID)
.getFirstValue());
}
if (expectedTypeId != null && expectedTypeId.equals(ObjectServiceTest.TEST_RELATION_TYPE_ID)) {
assertEquals(REL_CUSTOM_PROP_VALUE,
objectData.getProperties().getProperties().get(ObjectServiceTest.REL_STRING_PROP).getFirstValue());
}
String sourceId = (String) objectData.getProperties().getProperties().get(PropertyIds.SOURCE_ID)
.getFirstValue();
String targetId = (String) objectData.getProperties().getProperties().get(PropertyIds.TARGET_ID)
.getFirstValue();
if (RelationshipDirection.SOURCE == direction) {
assertEquals(refId, sourceId);
} else if (RelationshipDirection.TARGET == direction) {
assertEquals(refId, targetId);
} else {
assertTrue(refId.equals(sourceId) || refId.equals(targetId));
}
}
private String createRelationship(String name, String typeId, String sourceId, String targetId,
List<PropertyData<?>> additionalProperties) {
Properties props = createRelationshipProperties(name, typeId, sourceId, targetId, additionalProperties);
String id = fObjSvc.createRelationship(fRepositoryId, props, null, null, null, null);
return id;
}
private List<PropertyData<?>> createRelationshipProperties(String crossReferenceType) {
List<PropertyData<?>> properties = new ArrayList<PropertyData<?>>();
properties.add(fFactory.createPropertyStringData(ObjectServiceTest.REL_STRING_PROP, crossReferenceType));
return properties;
}
// create with a name
private Properties createRelationshipProperties(String name, String typeId, String sourceId, String targetId,
List<PropertyData<?>> additionalProperties) {
List<PropertyData<?>> properties = additionalProperties;
if (null == additionalProperties) {
properties = new ArrayList<PropertyData<?>>();
}
properties.add(fFactory.createPropertyIdData(PropertyIds.NAME, name));
properties.add(fFactory.createPropertyIdData(PropertyIds.OBJECT_TYPE_ID, typeId));
properties.add(fFactory.createPropertyIdData(PropertyIds.SOURCE_ID, sourceId));
properties.add(fFactory.createPropertyIdData(PropertyIds.TARGET_ID, targetId));
Properties props = fFactory.createPropertiesData(properties);
return props;
}
private String createVersionedDocument() {
String id = null;
id = fCreator.createDocument("VersionedDocument1", ObjectServiceTest.TEST_VERSION_DOCUMENT_TYPE_ID,
fRootFolderId, VersioningState.MAJOR, null);
return id;
}
private String createCheckedOutDocument() {
String id = createVersionedDocument();
Holder<Boolean> contentCopied = new Holder<Boolean>();
Holder<String> checkedOutId = new Holder<String>(id);
fVerSvc.checkOut(fRepositoryId, checkedOutId, null, contentCopied);
return checkedOutId.getValue();
}
private String createItem() {
String id;
List<PropertyData<?>> properties = new ArrayList<PropertyData<?>>();
properties.add(fFactory.createPropertyIdData(PropertyIds.NAME, "Item1"));
properties.add(fFactory.createPropertyIdData(PropertyIds.OBJECT_TYPE_ID, ObjectServiceTest.TEST_ITEM_TYPE_ID));
Properties props = fFactory.createPropertiesData(properties);
id = fObjSvc.createItem(fRepositoryId, props, fRootFolderId, null, null, null, null);
return id;
}
private void createHierarchy() {
String folderId1 = createFolder("MyFolder", fRootFolderId, BaseTypeId.CMIS_FOLDER.value());
assertNotNull(folderId1);
String folderId2 = createFolder("MySubFolder", folderId1, BaseTypeId.CMIS_FOLDER.value());
assertNotNull(folderId2);
docId3 = createDocument(MY_DOC_3, folderId1, BaseTypeId.CMIS_DOCUMENT.value(), true);
assertNotNull(docId2);
docId4 = createDocument(MY_DOC_4, folderId2, BaseTypeId.CMIS_DOCUMENT.value(), true);
assertNotNull(docId3);
}
private void getRelationshipsOfDescendants(List<ObjectInFolderContainer> ofcs, Map<String, List<ObjectData>> rels) {
for (ObjectInFolderContainer ofc : ofcs) {
log.debug("found desc: " + ofc.getObject().getObject().getProperties().getProperties().get("cmis:name"));
log.debug(" base: " + ofc.getObject().getObject().getBaseTypeId());
if (ofc.getObject().getObject().getBaseTypeId() == BaseTypeId.CMIS_DOCUMENT) {
rels.put(ofc.getObject().getObject().getId(), ofc.getObject().getObject().getRelationships());
} else {
getRelationshipsOfDescendants(ofc.getChildren(), rels);
// for ( ObjectInFolderContainer child : ofc.getChildren()) {
// }
}
}
}
}