blob: 54b95e8173d22b82966c9ece25b9b8984852c165 [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.client.bindings.framework;
import static org.apache.chemistry.opencmis.commons.impl.CollectionsHelper.isNotEmpty;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Set;
import junit.framework.TestCase;
import org.apache.chemistry.opencmis.commons.PropertyIds;
import org.apache.chemistry.opencmis.commons.data.Ace;
import org.apache.chemistry.opencmis.commons.data.Acl;
import org.apache.chemistry.opencmis.commons.data.AllowableActions;
import org.apache.chemistry.opencmis.commons.data.ContentStream;
import org.apache.chemistry.opencmis.commons.data.ExtensionsData;
import org.apache.chemistry.opencmis.commons.data.ObjectData;
import org.apache.chemistry.opencmis.commons.data.ObjectInFolderData;
import org.apache.chemistry.opencmis.commons.data.ObjectInFolderList;
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.data.PropertyDateTime;
import org.apache.chemistry.opencmis.commons.data.PropertyId;
import org.apache.chemistry.opencmis.commons.data.PropertyString;
import org.apache.chemistry.opencmis.commons.data.RenditionData;
import org.apache.chemistry.opencmis.commons.data.RepositoryInfo;
import org.apache.chemistry.opencmis.commons.definitions.DocumentTypeDefinition;
import org.apache.chemistry.opencmis.commons.definitions.PropertyDefinition;
import org.apache.chemistry.opencmis.commons.definitions.TypeDefinition;
import org.apache.chemistry.opencmis.commons.enums.AclPropagation;
import org.apache.chemistry.opencmis.commons.enums.Action;
import org.apache.chemistry.opencmis.commons.enums.CapabilityAcl;
import org.apache.chemistry.opencmis.commons.enums.CapabilityChanges;
import org.apache.chemistry.opencmis.commons.enums.CapabilityQuery;
import org.apache.chemistry.opencmis.commons.enums.CapabilityRenditions;
import org.apache.chemistry.opencmis.commons.enums.IncludeRelationships;
import org.apache.chemistry.opencmis.commons.enums.UnfileObject;
import org.apache.chemistry.opencmis.commons.enums.VersioningState;
import org.apache.chemistry.opencmis.commons.exceptions.CmisObjectNotFoundException;
import org.apache.chemistry.opencmis.commons.impl.IOUtils;
import org.apache.chemistry.opencmis.commons.spi.BindingsObjectFactory;
import org.apache.chemistry.opencmis.commons.spi.CmisBinding;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Base test case for CMIS tests.
*/
public abstract class AbstractCmisTestCase extends TestCase {
public static final String DEFAULT_TESTS_ENABLED = "true";
public static final String DEFAULT_USERNAME = "admin";
public static final String DEFAULT_PASSWORD = "admin";
public static final String DEFAULT_ATOMPUB_URL = "http://localhost:8080/chemistry-opencmis-server-jcr/atom";
public static final String DEFAULT_WEBSERVICES_URLPREFIX = "http://localhost:8080/cmis/services/";
public static final String DEFAULT_DOCTYPE = "cmis:document";
public static final String DEFAULT_FOLDERTYPE = "cmis:folder";
public static final String PROP_TESTS_ENABLED = "opencmis.test";
public static final String PROP_USERNAME = "opencmis.test.username";
public static final String PROP_PASSWORD = "opencmis.test.password";
public static final String PROP_REPOSITORY = "opencmis.test.repository";
public static final String PROP_TESTFOLDER = "opencmis.test.testfolder";
public static final String PROP_DOCTYPE = "opencmis.test.documenttype";
public static final String PROP_FOLDERTYPE = "opencmis.test.foldertype";
public static final String PROP_CONFIG_FILE = "opencmis.test.config";
public static final String PROP_ATOMPUB_URL = "opencmis.test.atompub.url";
public static final String PROP_WEBSERVICES_URLPREFIX = "opencmis.test.webservices.url";
private CmisBinding binding;
private String fTestRepositoryId;
private String fTestFolderId;
private static final Logger log = LoggerFactory.getLogger(AbstractCmisTestCase.class);
/**
* Read configuration file.
*/
static {
String configFileName = System.getProperty(PROP_CONFIG_FILE);
if (configFileName != null) {
try {
java.util.Properties properties = new java.util.Properties();
properties.load(new FileInputStream(configFileName));
for (Enumeration<?> e = properties.propertyNames(); e.hasMoreElements();) {
String key = (String) e.nextElement();
String value = properties.getProperty(key);
System.setProperty(key, value);
}
} catch (Exception e) {
System.err.println("Could not load test properties: " + e.toString());
}
}
}
/**
* Returns the binding object or creates one if does not exist.
*/
protected CmisBinding getBinding() {
if (binding == null) {
log.info("Creating binding...");
binding = createBinding();
}
return binding;
}
/**
* Creates a binding object.
*/
protected abstract CmisBinding createBinding();
/**
* Returns a set of test names that enabled.
*/
protected abstract Set<String> getEnabledTests();
/**
* Returns the test repository id.
*/
protected String getTestRepositoryId() {
if (fTestRepositoryId != null) {
return fTestRepositoryId;
}
fTestRepositoryId = System.getProperty(PROP_REPOSITORY);
if (fTestRepositoryId != null) {
log.info("Test repository: " + fTestRepositoryId);
return fTestRepositoryId;
}
fTestRepositoryId = getFirstRepositoryId();
log.info("Test repository: " + fTestRepositoryId);
return fTestRepositoryId;
}
/**
* Returns the test root folder id.
*/
protected String getTestRootFolder() {
if (fTestFolderId != null) {
return fTestFolderId;
}
fTestFolderId = System.getProperty(PROP_TESTFOLDER);
if (fTestFolderId != null) {
log.info("Test root folder: " + fTestFolderId);
return fTestFolderId;
}
fTestFolderId = getRootFolderId();
log.info("Test root folder: " + fTestFolderId);
return fTestFolderId;
}
/**
* Returns if the test is enabled.
*/
protected boolean isEnabled(String name) {
boolean testsEnabled = Boolean.parseBoolean(System.getProperty(PROP_TESTS_ENABLED, DEFAULT_TESTS_ENABLED));
if (testsEnabled && getEnabledTests().contains(name)) {
return true;
}
log.info("Skipping test '" + name + "'!");
return false;
}
/**
* Returns the test username.
*/
protected String getUsername() {
return System.getProperty(PROP_USERNAME, DEFAULT_USERNAME);
}
/**
* Returns the test password.
*/
protected String getPassword() {
return System.getProperty(PROP_PASSWORD, DEFAULT_PASSWORD);
}
/**
* Returns the default document type.
*/
protected String getDefaultDocumentType() {
return System.getProperty(PROP_DOCTYPE, DEFAULT_DOCTYPE);
}
/**
* Returns the default folder type.
*/
protected String getDefaultFolderType() {
return System.getProperty(PROP_FOLDERTYPE, DEFAULT_FOLDERTYPE);
}
/**
* Returns the AtomPub URL.
*/
protected String getAtomPubURL() {
return System.getProperty(PROP_ATOMPUB_URL, DEFAULT_ATOMPUB_URL);
}
/**
* Returns the Web Services URL prefix.
*/
protected String getWebServicesURL() {
return System.getProperty(PROP_WEBSERVICES_URLPREFIX, DEFAULT_WEBSERVICES_URLPREFIX);
}
/**
* Returns the object factory.
*/
protected BindingsObjectFactory getObjectFactory() {
return getBinding().getObjectFactory();
}
/**
* Returns the id of the first repository.
*/
protected String getFirstRepositoryId() {
List<RepositoryInfo> repositories = getBinding().getRepositoryService().getRepositoryInfos(null);
assertNotNull(repositories);
assertFalse(repositories.isEmpty());
assertNotNull(repositories.get(0).getId());
return repositories.get(0).getId();
}
/**
* Returns the info object of the test repository.
*/
protected RepositoryInfo getRepositoryInfo() {
RepositoryInfo repositoryInfo = getBinding().getRepositoryService().getRepositoryInfo(getTestRepositoryId(),
null);
assertNotNull(repositoryInfo);
assertNotNull(repositoryInfo.getId());
assertEquals(getTestRepositoryId(), repositoryInfo.getId());
return repositoryInfo;
}
/**
* Returns the root folder of the test repository.
*/
protected String getRootFolderId() {
RepositoryInfo repository = getRepositoryInfo();
assertNotNull(repository.getRootFolderId());
return repository.getRootFolderId();
}
/**
* Returns if the test repository supports reading ACLs.
*/
protected boolean supportsDiscoverACLs() {
RepositoryInfo repository = getRepositoryInfo();
assertNotNull(repository.getCapabilities());
return repository.getCapabilities().getAclCapability() != CapabilityAcl.NONE;
}
/**
* Returns if the test repository supports setting ACLs.
*/
protected boolean supportsManageACLs() {
RepositoryInfo repository = getRepositoryInfo();
assertNotNull(repository.getCapabilities());
return repository.getCapabilities().getAclCapability() == CapabilityAcl.MANAGE;
}
/**
* Returns if the test repository supports renditions.
*/
protected boolean supportsRenditions() {
RepositoryInfo repository = getRepositoryInfo();
assertNotNull(repository.getCapabilities());
if (repository.getCapabilities().getRenditionsCapability() == null) {
return false;
}
return repository.getCapabilities().getRenditionsCapability() != CapabilityRenditions.NONE;
}
/**
* Returns if the test repository supports descendants.
*/
protected boolean supportsDescendants() {
RepositoryInfo repository = getRepositoryInfo();
assertNotNull(repository.getCapabilities());
if (repository.getCapabilities().isGetDescendantsSupported() == null) {
return false;
}
return repository.getCapabilities().isGetDescendantsSupported();
}
/**
* Returns if the test repository supports descendants.
*/
protected boolean supportsFolderTree() {
RepositoryInfo repository = getRepositoryInfo();
assertNotNull(repository.getCapabilities());
if (repository.getCapabilities().isGetFolderTreeSupported() == null) {
return false;
}
return repository.getCapabilities().isGetFolderTreeSupported();
}
/**
* Returns if the test repository supports content changes.
*/
protected boolean supportsContentChanges() {
RepositoryInfo repository = getRepositoryInfo();
assertNotNull(repository.getCapabilities());
if (repository.getCapabilities().getChangesCapability() == null) {
return false;
}
return repository.getCapabilities().getChangesCapability() != CapabilityChanges.NONE;
}
/**
* Returns if the test repository supports query.
*/
protected boolean supportsQuery() {
RepositoryInfo repository = getRepositoryInfo();
assertNotNull(repository.getCapabilities());
if (repository.getCapabilities().getQueryCapability() == null) {
return false;
}
return repository.getCapabilities().getQueryCapability() != CapabilityQuery.NONE;
}
/**
* Returns if the test repository supports relationships.
*/
protected boolean supportsRelationships() {
TypeDefinition relType = null;
try {
relType = getBinding().getRepositoryService().getTypeDefinition(getTestRepositoryId(), "cmis:relationship",
null);
} catch (CmisObjectNotFoundException e) {
return false;
}
return relType != null;
}
/**
* Returns if the test repository supports policies.
*/
protected boolean supportsPolicies() {
TypeDefinition relType = null;
try {
relType = getBinding().getRepositoryService().getTypeDefinition(getTestRepositoryId(), "cmis:policy", null);
} catch (CmisObjectNotFoundException e) {
return false;
}
return relType != null;
}
/**
* Returns the AclPropagation from the ACL capabilities.
*/
protected AclPropagation getAclPropagation() {
RepositoryInfo repository = getRepositoryInfo();
assertNotNull(repository.getCapabilities());
if (repository.getAclCapabilities().getAclPropagation() == null) {
return AclPropagation.REPOSITORYDETERMINED;
}
return repository.getAclCapabilities().getAclPropagation();
}
// ---- helpers ----
/**
* Prints a warning.
*/
protected void warning(String message) {
System.out.println("**** " + message);
}
/**
* Creates a ContentStreamData object from a byte array.
*/
protected ContentStream createContentStreamData(String mimeType, byte[] content) {
assertNotNull(content);
return getObjectFactory().createContentStream("test", BigInteger.valueOf(content.length), mimeType,
new ByteArrayInputStream(content));
}
/**
* Extracts the path from a folder object.
*/
protected String getPath(ObjectData folderObject) {
assertNotNull(folderObject);
assertNotNull(folderObject.getProperties());
assertNotNull(folderObject.getProperties().getProperties());
assertTrue(folderObject.getProperties().getProperties().get(PropertyIds.PATH) instanceof PropertyString);
PropertyString pathProperty = (PropertyString) folderObject.getProperties().getProperties()
.get(PropertyIds.PATH);
assertNotNull(pathProperty.getValues());
assertEquals(1, pathProperty.getValues().size());
assertNotNull(pathProperty.getValues().get(0));
return pathProperty.getValues().get(0);
}
// ---- short cuts ----
/**
* Retrieves an object.
*/
protected ObjectData getObject(String objectId, String filter, Boolean includeAllowableActions,
IncludeRelationships includeRelationships, String renditionFilter, Boolean includePolicyIds,
Boolean includeACL, ExtensionsData extension) {
ObjectData object = getBinding().getObjectService()
.getObject(getTestRepositoryId(), objectId, filter, includeAllowableActions, includeRelationships,
renditionFilter, includePolicyIds, includeACL, extension);
assertNotNull(object);
return object;
}
/**
* Retrieves a full blown object.
*/
protected ObjectData getObject(String objectId) {
ObjectData object = getObject(objectId, "*", Boolean.TRUE, IncludeRelationships.BOTH, null, Boolean.TRUE,
Boolean.TRUE, null);
assertBasicProperties(object.getProperties());
return object;
}
/**
* Retrieves an object by path.
*/
protected ObjectData getObjectByPath(String path, String filter, Boolean includeAllowableActions,
IncludeRelationships includeRelationships, String renditionFilter, Boolean includePolicyIds,
Boolean includeACL, ExtensionsData extension) {
ObjectData object = getBinding().getObjectService()
.getObjectByPath(getTestRepositoryId(), path, filter, includeAllowableActions, includeRelationships,
renditionFilter, includePolicyIds, includeACL, extension);
assertNotNull(object);
return object;
}
/**
* Retrieves a full blown object by path.
*/
protected ObjectData getObjectByPath(String path) {
ObjectData object = getObjectByPath(path, "*", Boolean.TRUE, IncludeRelationships.BOTH, null, Boolean.TRUE,
Boolean.TRUE, null);
assertBasicProperties(object.getProperties());
return object;
}
/**
* Returns <code>true</code> if the object with the given id exists,
* <code>false</code> otherwise.
*/
protected boolean existsObject(String objectId) {
try {
ObjectData object = getObject(objectId, PropertyIds.OBJECT_ID, Boolean.FALSE, IncludeRelationships.NONE,
null, Boolean.FALSE, Boolean.FALSE, null);
assertNotNull(object);
assertNotNull(object.getId());
} catch (CmisObjectNotFoundException e) {
return false;
}
return true;
}
/**
* Returns the child of a folder.
*/
protected ObjectInFolderData getChild(String folderId, String objectId) {
boolean hasMore = true;
while (hasMore) {
ObjectInFolderList children = getBinding().getNavigationService().getChildren(getTestRepositoryId(),
folderId, "*", null, Boolean.TRUE, IncludeRelationships.BOTH, null, Boolean.TRUE, null, null, null);
assertNotNull(children);
assertTrue(isNotEmpty(children.getObjects()));
hasMore = (children.hasMoreItems() == null ? false : children.hasMoreItems().booleanValue());
for (ObjectInFolderData object : children.getObjects()) {
assertNotNull(object);
assertNotNull(object.getPathSegment());
assertNotNull(object.getObject());
assertNotNull(object.getObject().getId());
assertBasicProperties(object.getObject().getProperties());
if (object.getObject().getId().equals(objectId)) {
return object;
}
}
}
fail("Child not found!");
return null;
}
/**
* Gets the version series id of an object.
*/
protected String getVersionSeriesId(ObjectData object) {
PropertyData<?> versionSeriesId = object.getProperties().getProperties().get(PropertyIds.VERSION_SERIES_ID);
assertNotNull(versionSeriesId);
assertTrue(versionSeriesId instanceof PropertyId);
return ((PropertyId) versionSeriesId).getFirstValue();
}
/**
* Gets the version series id of an object.
*/
protected String getVersionSeriesId(String docId) {
return getVersionSeriesId(getObject(docId));
}
/**
* Creates a folder.
*/
protected String createFolder(Properties properties, String folderId, List<String> policies, Acl addACEs,
Acl removeACEs) {
String objectId = getBinding().getObjectService().createFolder(getTestRepositoryId(), properties, folderId,
policies, addACEs, removeACEs, null);
assertNotNull(objectId);
assertTrue(existsObject(objectId));
ObjectInFolderData folderChild = getChild(folderId, objectId);
// check canGetProperties
assertAllowableAction(folderChild.getObject().getAllowableActions(), Action.CAN_GET_PROPERTIES, true);
// check name
PropertyData<?> nameProp = properties.getProperties().get(PropertyIds.NAME);
if (nameProp != null) {
assertPropertyValue(folderChild.getObject().getProperties(), PropertyIds.NAME, PropertyString.class,
nameProp.getFirstValue());
}
// check object type
PropertyData<?> typeProp = properties.getProperties().get(PropertyIds.OBJECT_TYPE_ID);
assertNotNull(typeProp);
assertPropertyValue(folderChild.getObject().getProperties(), PropertyIds.OBJECT_TYPE_ID, PropertyId.class,
typeProp.getFirstValue());
// check parent
ObjectData parent = getBinding().getNavigationService().getFolderParent(getTestRepositoryId(), objectId, null,
null);
assertNotNull(parent);
assertNotNull(parent.getProperties());
assertNotNull(parent.getProperties().getProperties());
assertNotNull(parent.getProperties().getProperties().get(PropertyIds.OBJECT_ID));
assertEquals(folderId, parent.getProperties().getProperties().get(PropertyIds.OBJECT_ID).getFirstValue());
return objectId;
}
/**
* Creates a folder with the default type.
*/
protected String createDefaultFolder(String folderId, String name) {
List<PropertyData<?>> propList = new ArrayList<PropertyData<?>>();
propList.add(getObjectFactory().createPropertyStringData(PropertyIds.NAME, name));
propList.add(getObjectFactory().createPropertyIdData(PropertyIds.OBJECT_TYPE_ID, getDefaultFolderType()));
Properties properties = getObjectFactory().createPropertiesData(propList);
return createFolder(properties, folderId, null, null, null);
}
/**
* Creates a document.
*/
protected String createDocument(Properties properties, String folderId, ContentStream contentStream,
VersioningState versioningState, List<String> policies, Acl addACEs, Acl removeACEs) {
String objectId = getBinding().getObjectService().createDocument(getTestRepositoryId(), properties, folderId,
contentStream, versioningState, policies, addACEs, removeACEs, null);
assertNotNull(objectId);
assertTrue(existsObject(objectId));
if (folderId != null) {
ObjectInFolderData folderChild = getChild(folderId, objectId);
// check canGetProperties
assertAllowableAction(folderChild.getObject().getAllowableActions(), Action.CAN_GET_PROPERTIES, true);
// check canGetContentStream
if (contentStream != null) {
assertAllowableAction(folderChild.getObject().getAllowableActions(), Action.CAN_GET_CONTENT_STREAM,
true);
}
// check name
PropertyData<?> nameProp = properties.getProperties().get(PropertyIds.NAME);
if (nameProp != null) {
assertPropertyValue(folderChild.getObject().getProperties(), PropertyIds.NAME, PropertyString.class,
nameProp.getFirstValue());
}
// check object type
PropertyData<?> typeProp = properties.getProperties().get(PropertyIds.OBJECT_TYPE_ID);
assertNotNull(typeProp);
assertPropertyValue(folderChild.getObject().getProperties(), PropertyIds.OBJECT_TYPE_ID, PropertyId.class,
typeProp.getFirstValue());
// check parent
List<ObjectParentData> parents = getBinding().getNavigationService().getObjectParents(
getTestRepositoryId(), objectId, "*", Boolean.TRUE, IncludeRelationships.BOTH, null, Boolean.TRUE,
null);
assertNotNull(parents);
assertEquals(1, parents.size());
ObjectParentData parent = parents.get(0);
assertNotNull(parent);
assertNotNull(parent.getRelativePathSegment());
assertNotNull(parent.getObject());
assertNotNull(parent.getObject().getProperties().getProperties());
assertNotNull(parent.getObject().getProperties().getProperties().get(PropertyIds.OBJECT_ID));
assertEquals(folderId, parent.getObject().getProperties().getProperties().get(PropertyIds.OBJECT_ID)
.getFirstValue());
// get document by path (check relative path segment)
assertNotNull(parent.getObject().getProperties().getProperties().get(PropertyIds.PATH));
String parentPath = parent.getObject().getProperties().getProperties().get(PropertyIds.PATH)
.getFirstValue().toString();
ObjectData docByPath = getObjectByPath((parentPath.equals("/") ? "" : parentPath) + "/"
+ folderChild.getPathSegment());
PropertyData<?> idProp = docByPath.getProperties().getProperties().get(PropertyIds.OBJECT_ID);
assertNotNull(idProp);
assertEquals(objectId, idProp.getFirstValue());
} else {
List<ObjectParentData> parents = getBinding().getNavigationService().getObjectParents(
getTestRepositoryId(), objectId, null, Boolean.TRUE, IncludeRelationships.BOTH, null, Boolean.TRUE,
null);
assertNotNull(parents);
assertEquals(0, parents.size());
}
return objectId;
}
/**
* Creates a document with the default type.
*/
protected String createDefaultDocument(String folderId, String name, String contentType, byte[] content) {
VersioningState vs = (isVersionable(getDefaultDocumentType()) ? VersioningState.MAJOR : VersioningState.NONE);
List<PropertyData<?>> propList = new ArrayList<PropertyData<?>>();
propList.add(getObjectFactory().createPropertyStringData(PropertyIds.NAME, name));
propList.add(getObjectFactory().createPropertyIdData(PropertyIds.OBJECT_TYPE_ID, getDefaultDocumentType()));
Properties properties = getObjectFactory().createPropertiesData(propList);
ContentStream contentStream = createContentStreamData(contentType, content);
return createDocument(properties, folderId, contentStream, vs, null, null, null);
}
/**
* Creates a document from source.
*/
protected String createDocumentFromSource(String sourceId, Properties properties, String folderId,
VersioningState versioningState, List<String> policies, Acl addACEs, Acl removeACEs) {
String objectId = getBinding().getObjectService().createDocumentFromSource(getTestRepositoryId(), sourceId,
properties, folderId, versioningState, policies, addACEs, removeACEs, null);
assertNotNull(objectId);
assertTrue(existsObject(objectId));
if (folderId != null) {
ObjectInFolderData folderChild = getChild(folderId, objectId);
// check name
PropertyData<?> nameProp = properties.getProperties().get(PropertyIds.NAME);
if (nameProp != null) {
assertPropertyValue(folderChild.getObject().getProperties(), PropertyIds.NAME, PropertyString.class,
nameProp.getValues().get(0));
}
// check parent
List<ObjectParentData> parents = getBinding().getNavigationService().getObjectParents(
getTestRepositoryId(), objectId, null, Boolean.TRUE, IncludeRelationships.BOTH, null, Boolean.TRUE,
null);
assertNotNull(parents);
assertEquals(1, parents.size());
ObjectParentData parent = parents.get(0);
assertNotNull(parent);
assertNotNull(parent.getRelativePathSegment());
assertNotNull(parent.getObject());
assertNotNull(parent.getObject().getProperties().getProperties());
assertNotNull(parent.getObject().getProperties().getProperties().get(PropertyIds.OBJECT_ID));
assertEquals(folderId, parent.getObject().getProperties().getProperties().get(PropertyIds.OBJECT_ID)
.getFirstValue());
}
return objectId;
}
/**
* Deletes an object.
*/
protected void delete(String objectId, boolean allVersions) {
getBinding().getObjectService().deleteObject(getTestRepositoryId(), objectId, allVersions, null);
assertFalse(existsObject(objectId));
}
/**
* Deletes a tree.
*/
protected void deleteTree(String folderId) {
getBinding().getObjectService().deleteTree(getTestRepositoryId(), folderId, Boolean.TRUE, UnfileObject.DELETE,
Boolean.TRUE, null);
assertFalse(existsObject(folderId));
}
/**
* Gets a content stream.
*/
protected ContentStream getContent(String objectId, String streamId) {
ContentStream contentStream = getBinding().getObjectService().getContentStream(getTestRepositoryId(), objectId,
streamId, null, null, null);
assertNotNull(contentStream);
assertNotNull(contentStream.getMimeType());
assertNotNull(contentStream.getStream());
return contentStream;
}
/**
* Reads the content from a content stream into a byte array.
*/
protected byte[] readContent(ContentStream contentStream) throws Exception {
assertNotNull(contentStream);
assertNotNull(contentStream.getStream());
InputStream stream = contentStream.getStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
IOUtils.copy(stream, baos);
return baos.toByteArray();
}
/**
* Returns a type definition.
*/
protected TypeDefinition getTypeDefinition(String typeName) {
TypeDefinition typeDef = getBinding().getRepositoryService().getTypeDefinition(getTestRepositoryId(), typeName,
null);
assertNotNull(typeDef);
assertNotNull(typeDef.getId());
return typeDef;
}
/**
* Returns if the type is versionable.
*/
protected boolean isVersionable(String typeName) {
TypeDefinition type = getTypeDefinition(typeName);
assertTrue(type instanceof DocumentTypeDefinition);
Boolean isVersionable = ((DocumentTypeDefinition) type).isVersionable();
assertNotNull(isVersionable);
return isVersionable;
}
// ---- asserts ----
protected void assertEquals(TypeDefinition expected, TypeDefinition actual, boolean checkPropertyDefintions) {
if (expected == null && actual == null) {
return;
}
if (expected == null) {
fail("Expected type definition is null!");
}
if (actual == null) {
fail("Actual type definition is null!");
}
assertEquals("TypeDefinition id:", expected.getId(), actual.getId());
assertEquals("TypeDefinition local name:", expected.getLocalName(), actual.getLocalName());
assertEquals("TypeDefinition local namespace:", expected.getLocalNamespace(), actual.getLocalNamespace());
assertEquals("TypeDefinition display name:", expected.getDisplayName(), actual.getDisplayName());
assertEquals("TypeDefinition description:", expected.getDescription(), actual.getDescription());
assertEquals("TypeDefinition query name:", expected.getQueryName(), actual.getQueryName());
assertEquals("TypeDefinition parent id:", expected.getParentTypeId(), actual.getParentTypeId());
assertEquals("TypeDefinition base id:", expected.getBaseTypeId(), actual.getBaseTypeId());
if (!checkPropertyDefintions) {
return;
}
if (expected.getPropertyDefinitions() == null && actual.getPropertyDefinitions() == null) {
return;
}
if (expected.getPropertyDefinitions() == null) {
fail("Expected property definition list is null!");
}
if (actual.getPropertyDefinitions() == null) {
fail("Actual property definition list is null!");
}
assertEquals(expected.getPropertyDefinitions().size(), actual.getPropertyDefinitions().size());
for (PropertyDefinition<?> expectedPropDef : expected.getPropertyDefinitions().values()) {
PropertyDefinition<?> actualPropDef = actual.getPropertyDefinitions().get(expectedPropDef.getId());
assertEquals(expectedPropDef, actualPropDef);
}
}
protected void assertEquals(PropertyDefinition<?> expected, PropertyDefinition<?> actual) {
if (expected == null && actual == null) {
return;
}
if (expected == null) {
fail("Expected property definition is null!");
}
if (actual == null) {
fail("Actual property definition is null!");
}
assertNotNull(expected.getId());
assertNotNull(actual.getId());
String id = expected.getId();
assertEquals("PropertyDefinition " + id + " id:", expected.getId(), actual.getId());
assertEquals("PropertyDefinition " + id + " local name:", expected.getLocalName(), actual.getLocalName());
assertEquals("PropertyDefinition " + id + " local namespace:", expected.getLocalNamespace(),
actual.getLocalNamespace());
assertEquals("PropertyDefinition " + id + " query name:", expected.getQueryName(), actual.getQueryName());
assertEquals("PropertyDefinition " + id + " display name:", expected.getDisplayName(), actual.getDisplayName());
assertEquals("PropertyDefinition " + id + " description:", expected.getDescription(), actual.getDescription());
assertEquals("PropertyDefinition " + id + " property type:", expected.getPropertyType(),
actual.getPropertyType());
assertEquals("PropertyDefinition " + id + " cardinality:", expected.getCardinality(), actual.getCardinality());
assertEquals("PropertyDefinition " + id + " updatability:", expected.getUpdatability(),
actual.getUpdatability());
}
protected void assertEquals(Properties expected, Properties actual) {
if (expected == null && actual == null) {
return;
}
if (expected == null) {
fail("Expected properties data is null!");
}
if (actual == null) {
fail("Actual properties data is null!");
}
if (expected.getProperties() == null && actual.getProperties() == null) {
return;
}
if (expected.getProperties() == null || actual.getProperties() == null) {
fail("Properties are null!");
}
if (expected.getProperties() == null) {
fail("Expected properties are null!");
}
if (actual.getProperties() == null) {
fail("Actual properties are null!");
}
assertEquals(expected.getProperties().size(), actual.getProperties().size());
for (String id : expected.getProperties().keySet()) {
PropertyData<?> expectedProperty = expected.getProperties().get(id);
assertNotNull(expectedProperty);
assertEquals(id, expectedProperty.getId());
PropertyData<?> actualProperty = actual.getProperties().get(id);
assertNotNull(actualProperty);
assertEquals(id, actualProperty.getId());
assertEquals(expectedProperty, actualProperty);
}
}
protected void assertEquals(PropertyData<?> expected, PropertyData<?> actual) {
if (expected == null && actual == null) {
return;
}
if (expected == null || actual == null) {
fail("Properties data is null!");
}
String id = expected.getId();
assertEquals("PropertyData " + id + " id:", expected.getId(), actual.getId());
assertEquals("PropertyData " + id + " display name:", expected.getDisplayName(), actual.getDisplayName());
assertEquals("PropertyData " + id + " local name:", expected.getLocalName(), actual.getLocalName());
assertEquals("PropertyData " + id + " query name:", expected.getQueryName(), actual.getQueryName());
assertEquals("PropertyData " + id + " values:", expected.getValues().size(), actual.getValues().size());
for (int i = 0; i < expected.getValues().size(); i++) {
assertEquals("PropertyData " + id + " value[" + i + "]:", expected.getValues().get(i), actual.getValues()
.get(i));
}
}
protected void assertBasicProperties(Properties properties) {
assertNotNull(properties);
assertNotNull(properties.getProperties());
assertProperty(properties.getProperties().get(PropertyIds.OBJECT_ID), PropertyIds.OBJECT_ID, PropertyId.class);
assertProperty(properties.getProperties().get(PropertyIds.OBJECT_TYPE_ID), PropertyIds.OBJECT_TYPE_ID,
PropertyId.class);
assertProperty(properties.getProperties().get(PropertyIds.BASE_TYPE_ID), PropertyIds.BASE_TYPE_ID,
PropertyId.class);
assertProperty(properties.getProperties().get(PropertyIds.NAME), PropertyIds.NAME, PropertyString.class);
assertProperty(properties.getProperties().get(PropertyIds.CREATED_BY), PropertyIds.CREATED_BY,
PropertyString.class);
assertProperty(properties.getProperties().get(PropertyIds.CREATION_DATE), PropertyIds.CREATION_DATE,
PropertyDateTime.class);
assertProperty(properties.getProperties().get(PropertyIds.LAST_MODIFIED_BY), PropertyIds.LAST_MODIFIED_BY,
PropertyString.class);
assertProperty(properties.getProperties().get(PropertyIds.LAST_MODIFICATION_DATE),
PropertyIds.LAST_MODIFICATION_DATE, PropertyDateTime.class);
}
protected void assertProperty(PropertyData<?> property, String id, Class<?> clazz) {
assertNotNull(property);
assertNotNull(property.getId());
assertEquals("PropertyData " + id + " id:", id, property.getId());
assertTrue(clazz.isAssignableFrom(property.getClass()));
assertNotNull(property.getValues());
assertFalse(property.getValues().isEmpty());
}
protected void assertPropertyValue(PropertyData<?> property, String id, Class<?> clazz, Object... values) {
assertProperty(property, id, clazz);
assertEquals("Property " + id + " values:", values.length, property.getValues().size());
int i = 0;
for (Object value : property.getValues()) {
assertEquals("Property " + id + " value[" + i + "]:", values[i], value);
i++;
}
}
protected void assertPropertyValue(Properties properties, String id, Class<?> clazz, Object... values) {
assertNotNull(properties);
assertNotNull(properties.getProperties());
PropertyData<?> property = properties.getProperties().get(id);
assertNotNull(property);
assertPropertyValue(property, id, clazz, values);
}
protected void assertEquals(AllowableActions expected, AllowableActions actual) {
if (expected == null && actual == null) {
return;
}
if (expected == null) {
fail("Expected allowable action data is null!");
}
if (actual == null) {
fail("Actual allowable action data is null!");
}
assertNotNull(expected.getAllowableActions());
assertNotNull(actual.getAllowableActions());
assertEquals("Allowable action size:", expected.getAllowableActions().size(), actual.getAllowableActions()
.size());
for (Action action : expected.getAllowableActions()) {
boolean expectedBoolean = expected.getAllowableActions().contains(action);
boolean actualBoolean = actual.getAllowableActions().contains(action);
assertEquals("AllowableAction " + action + ":", expectedBoolean, actualBoolean);
}
}
protected void assertAllowableAction(AllowableActions allowableActions, Action action, boolean expected) {
assertNotNull(allowableActions);
assertNotNull(allowableActions.getAllowableActions());
assertNotNull(action);
assertEquals("Allowable action \"" + action + "\":", expected,
allowableActions.getAllowableActions().contains(action));
}
protected void assertEquals(Acl expected, Acl actual) {
if (expected == null && actual == null) {
return;
}
if (expected == null) {
fail("Expected ACL data is null!");
}
if (actual == null) {
fail("Actual ACL data is null!");
}
if (expected.getAces() == null && actual.getAces() == null) {
return;
}
if (expected.getAces() == null) {
fail("Expected ACE data is null!");
}
if (actual.getAces() == null) {
fail("Actual ACE data is null!");
}
// assertEquals(expected.isExact(), actual.isExact());
assertEquals(expected.getAces().size(), actual.getAces().size());
for (int i = 0; i < expected.getAces().size(); i++) {
assertEquals(expected.getAces().get(i), actual.getAces().get(i));
}
}
protected void assertEquals(Ace expected, Ace actual) {
if (expected == null && actual == null) {
return;
}
if (expected == null) {
fail("Expected ACE data is null!");
}
if (actual == null) {
fail("Actual ACE data is null!");
}
assertNotNull(expected.getPrincipal());
assertNotNull(expected.getPrincipal().getId());
assertNotNull(actual.getPrincipal());
assertNotNull(actual.getPrincipal().getId());
assertEquals("ACE Principal:", expected.getPrincipal().getId(), actual.getPrincipal().getId());
assertEqualLists(expected.getPermissions(), actual.getPermissions());
}
protected void assertEquals(RenditionData expected, RenditionData actual) {
if (expected == null && actual == null) {
return;
}
if (expected == null) {
fail("Expected rendition is null!");
}
if (actual == null) {
fail("Actual rendition is null!");
}
assertEquals("Rendition kind:", expected.getKind(), actual.getKind());
assertEquals("Rendition MIME type:", expected.getMimeType(), actual.getMimeType());
assertEquals("Rendition length:", expected.getBigLength(), actual.getBigLength());
assertEquals("Rendition stream id:", expected.getStreamId(), actual.getStreamId());
assertEquals("Rendition title:", expected.getTitle(), actual.getTitle());
assertEquals("Rendition height:", expected.getBigHeight(), actual.getBigHeight());
assertEquals("Rendition width:", expected.getBigWidth(), actual.getBigWidth());
assertEquals("Rendition document id:", expected.getRenditionDocumentId(), actual.getRenditionDocumentId());
}
protected void assertContent(byte[] expected, byte[] actual) {
assertNotNull(expected);
assertNotNull(actual);
assertEquals("Content size:", expected.length, actual.length);
for (int i = 0; i < expected.length; i++) {
assertEquals("Content not equal.", expected[i], actual[i]);
}
}
protected void assertMimeType(String expected, String actual) {
assertNotNull(expected);
assertNotNull(actual);
int paramIdx = actual.indexOf(';');
if (paramIdx != -1) {
actual = actual.substring(0, paramIdx);
}
assertEquals(expected, actual);
}
protected void assertEqualLists(List<?> expected, List<?> actual) {
if (expected == null && actual == null) {
return;
}
if (expected == null) {
fail("Expected list is null!");
}
if (actual == null) {
fail("Actual list is null!");
}
assertEquals("List size:", expected.size(), actual.size());
for (int i = 0; i < expected.size(); i++) {
assertEquals("List element " + i + ":", expected.get(i), actual.get(i));
}
}
}