You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@chemistry.apache.org by je...@apache.org on 2010/04/16 16:00:25 UTC

svn commit: r934878 [11/13] - in /incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src: main/java/org/apache/chemistry/opencmis/inmemory/ main/java/org/apache/chemistry/opencmis/inmemory/clientprovider/ ma...

Modified: incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/RepositoryServiceTest.java
URL: http://svn.apache.org/viewvc/incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/RepositoryServiceTest.java?rev=934878&r1=934877&r2=934878&view=diff
==============================================================================
--- incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/RepositoryServiceTest.java (original)
+++ incubator/chemistry/opencmis/trunk/chemistry-opencmis-server/chemistry-opencmis-server-inmemory/src/test/java/org/apache/chemistry/opencmis/inmemory/RepositoryServiceTest.java Fri Apr 16 14:00:23 2010
@@ -70,706 +70,701 @@ import static org.junit.Assert.*;
  */
 public class RepositoryServiceTest extends AbstractServiceTst {
 
-//  private CmisProvider fProvider;
+	// private CmisProvider fProvider;
 
-  private static Log log = LogFactory.getLog(RepositoryServiceTest.class);
-  private static final String REPOSITORY_ID = "UnitTestRepository";
+	private static Log log = LogFactory.getLog(RepositoryServiceTest.class);
+	private static final String REPOSITORY_ID = "UnitTestRepository";
 
-  static public class UnitTestRepositoryInfo implements RepositoryInfoCreator {
+	static public class UnitTestRepositoryInfo implements RepositoryInfoCreator {
+
+		public RepositoryInfo createRepositoryInfo() {
+			RepositoryCapabilitiesImpl caps = new RepositoryCapabilitiesImpl();
+			caps.setAllVersionsSearchable(false);
+			caps.setCapabilityAcl(CapabilityAcl.NONE);
+			caps.setCapabilityChanges(CapabilityChanges.NONE);
+			caps.setCapabilityContentStreamUpdates(CapabilityContentStreamUpdates.ANYTIME);
+			caps.setCapabilityJoin(CapabilityJoin.NONE);
+			caps.setCapabilityQuery(CapabilityQuery.NONE);
+			caps.setCapabilityRendition(CapabilityRenditions.NONE);
+			caps.setIsPwcSearchable(false);
+			caps.setIsPwcUpdatable(true);
+			caps.setSupportsGetDescendants(true);
+			caps.setSupportsGetFolderTree(true);
+			caps.setSupportsMultifiling(false);
+			caps.setSupportsUnfiling(true);
+			caps.setSupportsVersionSpecificFiling(false);
+
+			RepositoryInfoImpl repositoryInfo = new RepositoryInfoImpl();
+			repositoryInfo.setRepositoryId(REPOSITORY_ID);
+			repositoryInfo.setRepositoryName("InMemory Repository");
+			repositoryInfo.setRepositoryDescription("InMemory Test Repository");
+			repositoryInfo.setCmisVersionSupported("0.7");
+			repositoryInfo.setRepositoryCapabilities(caps);
+			repositoryInfo.setRootFolder("/");
+			repositoryInfo.setAclCapabilities(null);
+			repositoryInfo.setPrincipalAnonymous("anonymous");
+			repositoryInfo.setPrincipalAnyone("anyone");
+			repositoryInfo.setThinClientUri(null);
+			repositoryInfo.setChangesIncomplete(Boolean.TRUE);
+			repositoryInfo.setChangesOnType(null);
+			repositoryInfo.setLatestChangeLogToken(null);
+			repositoryInfo.setVendorName("OpenCMIS");
+			repositoryInfo.setProductName("OpenCMIS Client");
+			repositoryInfo.setProductVersion("0.1");
+			return repositoryInfo;
+		}
+	}
+
+	@Before
+	public void setUp() throws Exception {
+		super.setTypeCreatorClass(RepositoryTestTypeSystemCreator.class.getName());
+		super.setUp();
+	}
+
+	@After
+	public void tearDown() throws Exception {
+		super.tearDown();
+	}
+
+	@Test
+	public void testRepositoryInfo() throws Exception {
+		log.info("starting testRepositoryInfo() ...");
+		List<RepositoryInfo> repositories = fRepSvc.getRepositoryInfos(null);
+		assertNotNull(repositories);
+		assertFalse(repositories.isEmpty());
+
+		log.info("geRepositoryInfo(), found " + repositories.size() + " repository/repositories).");
+
+		for (RepositoryInfo repository : repositories) {
+			RepositoryInfo repository2 = fRepSvc.getRepositoryInfo(repository.getId(), null);
+			assertNotNull(repository2);
+			assertEquals(repository.getId(), repository2.getId());
+			log.info("found repository" + repository2.getId());
+		}
+
+		log.info("... testRepositoryInfo() finished.");
+	}
+
+	@Test
+	public void testTypeDefinition() throws Exception {
+		log.info("");
+		log.info("starting testTypeDefinition() ...");
+		String repositoryId = getRepositoryId();
+		String typeId = "MyDocType1";
+		TypeDefinition ref = RepositoryTestTypeSystemCreator.getTypeById(typeId);
+		TypeDefinition type = fRepSvc.getTypeDefinition(repositoryId, typeId, null);
+		assertEquals(ref.getId(), type.getId());
+		assertEquals(ref.getDescription(), type.getDescription());
+		assertEquals(ref.getDisplayName(), type.getDisplayName());
+		assertEquals(ref.getLocalName(), type.getLocalName());
+		assertEquals(ref.getLocalNamespace(), type.getLocalNamespace());
+		containsAllBasePropertyDefinitions(type);
+		log.info("... testTypeDefinition() finished.");
+	}
+
+	@Test
+	public void testGetAllTypesUnlimitedDepth() {
+		log.info("");
+		log.info("starting testGetAllTypesUnlimitedDepth()...");
+		String repositoryId = getRepositoryId();
+
+		// get types
+		List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(repositoryId, null/*
+																							 * all
+																							 * types
+																							 */,
+				BigInteger.valueOf(-1), Boolean.TRUE, null);
+		assertNotNull(types);
+		log.info("Repository " + repositoryId + " contains " + types.size() + " type(s).");
+
+		// check that we got all types
+		int expectedSize = RepositoryTestTypeSystemCreator.getTypesList().size()
+				+ DocumentTypeCreationHelper.getDefaultTypes().size();
+		int totalSize = getRecursiveSize(types);
+
+		assertEquals(expectedSize, totalSize);
+		assertEquals(2, types.size());
+
+		for (TypeDefinitionContainer type : types) {
+			assertNotNull(type);
+			TypeDefinition typeDef = type.getTypeDefinition();
+			assertNotNull(typeDef);
+			assertNotNull(typeDef.getId());
+			assertNotNull(typeDef.getBaseTypeId());
+			log.info("Found type: " + typeDef.getId() + ", display name is: " + typeDef.getDisplayName());
+			log.info("  Base type is: " + typeDef.getBaseTypeId());
+			log.info("  Number of children types is: " + type.getChildren().size());
+			Map<String, PropertyDefinition<?>> propDefs = type.getTypeDefinition().getPropertyDefinitions();
+			log.info("  Number of properties is: " + (propDefs == null ? 0 : propDefs.size()));
+			containsAllBasePropertyDefinitions(typeDef);
+		}
+
+		log.info("... testGetAllTypesUnlimitedDepth() finished.");
+	}
+
+	@Test
+	public void testGetAllTypesLimitedDepth() {
+		log.info("");
+		log.info("starting testGetAllTypesLimitedDepth()...");
+		String repositoryId = getRepositoryId();
+
+		// get types
+		int depth = 1;
+		List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(repositoryId,
+				BaseTypeId.CMIS_DOCUMENT.value(), BigInteger.valueOf(depth), Boolean.TRUE, null);
+		assertNotNull(types);
+		log.info("Found in repository " + repositoryId + " " + types.size() + " type(s) with depth " + depth + ".");
+
+		for (TypeDefinitionContainer type : types) {
+			TypeDefinition typeDef = type.getTypeDefinition();
+			log.info("Found type: " + typeDef.getId() + ", display name is: " + typeDef.getDisplayName());
+			log.info("  Base type is: " + typeDef.getBaseTypeId());
+			log.info("  Number of children types is: " + type.getChildren().size());
+			containsAllBasePropertyDefinitions(typeDef);
+		}
+
+		int totalSize = getRecursiveSize(types);
+		assertEquals(4, totalSize); // all RepositoryTestTypeSystemCreator types
+									// minus one in level two plus cmis.docment
+		assertFalse(containsTypeByIdRecursive(BaseTypeId.CMIS_DOCUMENT.value(), types));
+		assertFalse(containsTypeByIdRecursive(BaseTypeId.CMIS_FOLDER.value(), types));
+
+		assertTrue(containsTypeByIdRecursive("MyDocType1", types));
+		assertTrue(containsTypeByIdRecursive("MyDocType2", types));
+
+		assertFalse(containsTypeByIdRecursive(RepositoryTestTypeSystemCreator.LEVEL2_TYPE, types));
+
+		for (TypeDefinitionContainer type : types) {
+			assertNotNull(type);
+			TypeDefinition typeDef = type.getTypeDefinition();
+			assertNotNull(typeDef);
+			assertNotNull(typeDef.getId());
+			assertNotNull(typeDef.getBaseTypeId());
+		}
+
+		log.info("... testGetAllTypesLimitedDepth() finished.");
+	}
+
+	@Test
+	public void testGetSpecificTypeLimitedDepth() {
+		log.info("");
+		log.info("starting testGetSpecificTypeLimitedDepth()...");
+		String repositoryId = getRepositoryId();
+
+		// get types
+		int depth = 2;
+		String typeId = "MyDocType1";
+		List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(repositoryId, typeId, BigInteger
+				.valueOf(depth), Boolean.TRUE, null);
+		assertNotNull(types);
+		log.info("Found in repository " + repositoryId + " for type " + typeId + ", " + types.size()
+				+ " type(s) with depth " + depth + ".");
+
+		assertEquals(4, getRecursiveSize(types));
+		assertTrue(containsTypeByIdRecursive("MyDocType1.1", types));
+		assertTrue(containsTypeByIdRecursive("MyDocType1.2", types));
+		assertTrue(containsTypeByIdRecursive("MyDocType1.1.1", types));
+		assertTrue(containsTypeByIdRecursive("MyDocType1.1.2", types));
+		for (TypeDefinitionContainer type : types) {
+			assertNotNull(type);
+			TypeDefinition typeDef = type.getTypeDefinition();
+			assertNotNull(typeDef);
+			assertNotNull(typeDef.getId());
+			assertNotNull(typeDef.getBaseTypeId());
+			log.info("Found type: " + typeDef.getId() + ", display name is: " + typeDef.getDisplayName());
+			log.info("  Base type is: " + typeDef.getBaseTypeId());
+			log.info("  Number of children types is: " + type.getChildren().size());
+			containsAllBasePropertyDefinitions(typeDef);
+		}
+
+		log.info("... testGetSpecificTypeLimitedDepth() finished.");
+	}
+
+	@Test
+	public void testGetTypesWithoutProperties() {
+		log.info("");
+		log.info("starting testGetTypesWithoutProperties()...");
+		String repositoryId = getRepositoryId();
+		String typeId = BaseTypeId.CMIS_DOCUMENT.value();
+
+		// get types
+		List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(repositoryId, typeId, BigInteger.valueOf(-1),
+				false, null);
+		assertNotNull(types);
+		log.info("Repository " + repositoryId + " contains " + types.size() + " type(s).");
+
+		TypeDefinitionContainer typeWithProps = null;
+		for (TypeDefinitionContainer type : types) {
+			if (type.getTypeDefinition().getId().equals(RepositoryTestTypeSystemCreator.COMPLEX_TYPE)) {
+				typeWithProps = type;
+				break;
+			}
+		}
+		assertNotNull(typeWithProps);
+		TypeDefinition typeDef = typeWithProps.getTypeDefinition();
+		Map<String, PropertyDefinition<?>> propDefs = typeDef.getPropertyDefinitions();
+		log.info("Found type: " + typeDef.getId() + ", display name is: " + typeDef.getDisplayName());
+		log.info("  Base type is: " + typeDef.getBaseTypeId());
+		log.info("  Number of properties is: " + (propDefs == null ? 0 : propDefs.size()));
+		assertTrue(propDefs == null || propDefs.size() == 0);
+		log.info("... testGetTypesWithoutProperties() finished.");
+	}
+
+	@Test
+	public void testGetTypeChildren() {
+		log.info("");
+		log.info("starting testGetTypeChildren()...");
+		String repositoryId = getRepositoryId();
+		String typeId = "MyDocType2";
+
+		// get all children
+		BigInteger maxItems = BigInteger.valueOf(1000);
+		BigInteger skipCount = BigInteger.valueOf(0);
+		TypeDefinitionList children = fRepSvc.getTypeChildren(repositoryId, typeId, true, maxItems, skipCount, null);
+
+		for (TypeDefinition type : children.getList()) {
+			log.info("Found type: " + type.getId() + ", display name is: " + type.getDisplayName());
+			containsAllBasePropertyDefinitions(type);
+		}
+		assertEquals(9, children.getList().size());
+		assertEquals(9, children.getNumItems().intValue());
+		assertFalse(children.hasMoreItems());
+
+		// get a chunk
+		maxItems = BigInteger.valueOf(5);
+		skipCount = BigInteger.valueOf(3);
+		children = fRepSvc.getTypeChildren(repositoryId, typeId, true, maxItems, skipCount, null);
+
+		for (TypeDefinition type : children.getList()) {
+			log.info("Found type: " + type.getId() + ", display name is: " + type.getDisplayName());
+			containsAllBasePropertyDefinitions(type);
+		}
+		assertEquals(5, children.getList().size());
+		assertEquals(9, children.getNumItems().intValue());
+		assertTrue(children.hasMoreItems());
+
+		log.info("... testGetTypeChildren() finished.");
+	}
+
+	@Test
+	public void testGetWrongParameters() {
+		log.info("");
+		log.info("starting testGetWrongParameters()...");
+		String repositoryId = getRepositoryId();
+		String wrongRepositoryId = "NonExistantRepository";
+
+		// get types
+		int depth = -1;
+		String wrongTypeId = "UnknownType";
+
+		try {
+			RepositoryInfo repInf = fRepSvc.getRepositoryInfo(wrongRepositoryId, null);
+			log.debug("getRepositoryInfo(): " + repInf);
+			fail("getRepositoryInfo() with illegal repository id should throw InvalidArgumentException.");
+		} catch (CmisInvalidArgumentException e) {
+			log.info("getRepositoryInfo() with depth==0 raised expected exception: " + e);
+		}
+
+		try {
+			List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(repositoryId, "CMISDocument", BigInteger
+					.valueOf(0), Boolean.TRUE, null);
+			log.debug("getTypeDescendants(): " + types);
+			fail("getTypeDescendants() with depth 0 should throw InvalidArgumentException.");
+		} catch (CmisInvalidArgumentException e) {
+			log.info("getTypeDescendants() with depth==0 raised expected exception: " + e);
+		}
+
+		try {
+			List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(repositoryId, wrongTypeId, BigInteger
+					.valueOf(depth), Boolean.TRUE, null);
+			log.debug("getTypeDescendants(): " + types);
+			fail("getTypeDescendants() with unknown type should throw exception.");
+		} catch (CmisInvalidArgumentException e) {
+			log.info("getTypeDescendants() with unknown type raised expected exception: " + e);
+		}
+
+		try {
+			TypeDefinition type = fRepSvc.getTypeDefinition(wrongRepositoryId, "CMISDocument", null);
+			log.debug("getTypeDefinition(): " + type);
+			fail("getTypeDefinition() with unknown repository id should throw exception.");
+		} catch (CmisInvalidArgumentException e) {
+			log.info("getTypeDefinition() with unknown repository id raised expected exception: " + e);
+		}
+
+		try {
+			TypeDefinition type = fRepSvc.getTypeDefinition(repositoryId, wrongTypeId, null);
+			log.debug("getTypeDefinition(): " + type);
+			fail("getTypeDefinition() with unknown type should throw exception.");
+		} catch (CmisObjectNotFoundException e) {
+			log.info("getTypeDefinition() with unknown type raised expected exception: " + e);
+		}
+
+		try {
+			TypeDefinitionList types = fRepSvc.getTypeChildren(wrongRepositoryId, "CMISDocument", Boolean.TRUE,
+					BigInteger.valueOf(100), BigInteger.ZERO, null);
+			log.debug("getTypeChildren(): " + types);
+			fail("getTypeDescendants() with unknown type should throw InvalidArgumentException.");
+		} catch (CmisInvalidArgumentException e) {
+			log.info("getTypeDescendants() with unknown repository id raised expected exception: " + e);
+		}
+
+		try {
+			TypeDefinitionList types = fRepSvc.getTypeChildren(repositoryId, wrongTypeId, Boolean.TRUE, BigInteger
+					.valueOf(100), BigInteger.ZERO, null);
+			log.debug("getTypeChildren(): " + types);
+			fail("getTypeDescendants() with unknown type should throw exception.");
+		} catch (CmisInvalidArgumentException e) {
+			log.info("getTypeDescendants() with unknown type raised expected exception: " + e);
+		}
+
+		log.info("... testGetUnknownType() testGetWrongParameters.");
+
+	}
+
+	@Test
+	public void testInheritedProperties() {
+		log.info("");
+		log.info("starting testInheritedProperties()...");
+		String repositoryId = getRepositoryId();
+		String typeId = RepositoryTestTypeSystemCreator.TOPLEVEL_TYPE;
+
+		// get top level type
+		TypeDefinition typeContainer = fRepSvc.getTypeDefinition(repositoryId, typeId, null);
+		assertNotNull(typeContainer);
+		Map<String, PropertyDefinition<?>> propDefMap = typeContainer.getPropertyDefinitions();
+		assertTrue(propDefMap.containsKey("StringPropTopLevel"));
+		assertFalse(propDefMap.get("StringPropTopLevel").isInherited());
+		assertFalse(propDefMap.containsKey("StringPropLevel1"));
+		assertFalse(propDefMap.containsKey("StringPropLevel2"));
+		containsAllBasePropertyDefinitions(typeContainer);
+
+		// get level 1 type
+		typeId = RepositoryTestTypeSystemCreator.LEVEL1_TYPE;
+		typeContainer = fRepSvc.getTypeDefinition(repositoryId, typeId, null);
+		assertNotNull(typeContainer);
+		propDefMap = typeContainer.getPropertyDefinitions();
+		assertTrue(propDefMap.containsKey("StringPropTopLevel"));
+		assertTrue(propDefMap.get("StringPropTopLevel").isInherited());
+		assertTrue(propDefMap.containsKey("StringPropLevel1"));
+		assertFalse(propDefMap.get("StringPropLevel1").isInherited());
+		assertFalse(propDefMap.containsKey("StringPropLevel2"));
+		containsAllBasePropertyDefinitions(typeContainer);
+
+		// get level 2 type
+		typeId = RepositoryTestTypeSystemCreator.LEVEL2_TYPE;
+		typeContainer = fRepSvc.getTypeDefinition(repositoryId, typeId, null);
+		assertNotNull(typeContainer);
+		propDefMap = typeContainer.getPropertyDefinitions();
+		assertTrue(propDefMap.containsKey("StringPropTopLevel"));
+		assertTrue(propDefMap.get("StringPropTopLevel").isInherited());
+		assertTrue(propDefMap.containsKey("StringPropLevel1"));
+		assertTrue(propDefMap.get("StringPropLevel1").isInherited());
+		assertTrue(propDefMap.containsKey("StringPropLevel2"));
+		assertFalse(propDefMap.get("StringPropLevel2").isInherited());
+		containsAllBasePropertyDefinitions(typeContainer);
+
+		log.info("... testInheritedProperties() finished.");
+	}
+
+	private String getRepositoryId() {
+		List<RepositoryInfo> repositories = fRepSvc.getRepositoryInfos(null);
+		RepositoryInfo repository = repositories.get(0);
+		assertNotNull(repository);
+		return repository.getId();
+	}
+
+	private boolean containsTypeById(String typeId, List<TypeDefinitionContainer> types) {
+		for (TypeDefinitionContainer type : types) {
+			if (type.getTypeDefinition().getId().equals(typeId))
+				return true;
+		}
+		return false;
+	}
+
+	private boolean containsTypeByIdRecursive(String typeId, List<TypeDefinitionContainer> types) {
+		for (TypeDefinitionContainer type : types) {
+			if (containsTypeByIdRecursive(typeId, type))
+				return true;
+		}
+		return false;
+	}
+
+	private boolean containsTypeByIdRecursive(String typeId, TypeDefinitionContainer typeContainer) {
+		if (typeId.equals(typeContainer.getTypeDefinition().getId()))
+			return true;
+
+		for (TypeDefinitionContainer type : typeContainer.getChildren()) {
+			if (containsTypeByIdRecursive(typeId, type))
+				return true;
+		}
+		return false;
+	}
+
+	private void containsAllBasePropertyDefinitions(TypeDefinition typeDef) {
+		Map<String, PropertyDefinition<?>> propDefs = typeDef.getPropertyDefinitions();
+		String baseTypeId = typeDef.getBaseTypeId().value();
+
+		assertTrue(propDefs.containsKey(PropertyIds.NAME));
+		assertTrue(propDefs.containsKey(PropertyIds.OBJECT_ID));
+		assertTrue(propDefs.containsKey(PropertyIds.OBJECT_TYPE_ID));
+		assertTrue(propDefs.containsKey(PropertyIds.BASE_TYPE_ID));
+		assertTrue(propDefs.containsKey(PropertyIds.CREATED_BY));
+		assertTrue(propDefs.containsKey(PropertyIds.CREATION_DATE));
+		assertTrue(propDefs.containsKey(PropertyIds.LAST_MODIFIED_BY));
+		assertTrue(propDefs.containsKey(PropertyIds.LAST_MODIFICATION_DATE));
+		assertTrue(propDefs.containsKey(PropertyIds.CHANGE_TOKEN));
+
+		if (baseTypeId.equals(BaseTypeId.CMIS_DOCUMENT.value())) {
+			assertTrue(propDefs.containsKey(PropertyIds.IS_IMMUTABLE));
+			assertTrue(propDefs.containsKey(PropertyIds.IS_LATEST_VERSION));
+			assertTrue(propDefs.containsKey(PropertyIds.IS_MAJOR_VERSION));
+			assertTrue(propDefs.containsKey(PropertyIds.IS_LATEST_MAJOR_VERSION));
+			assertTrue(propDefs.containsKey(PropertyIds.VERSION_LABEL));
+			assertTrue(propDefs.containsKey(PropertyIds.VERSION_SERIES_ID));
+			assertTrue(propDefs.containsKey(PropertyIds.IS_VERSION_SERIES_CHECKED_OUT));
+			assertTrue(propDefs.containsKey(PropertyIds.VERSION_SERIES_CHECKED_OUT_BY));
+			assertTrue(propDefs.containsKey(PropertyIds.VERSION_SERIES_CHECKED_OUT_ID));
+			assertTrue(propDefs.containsKey(PropertyIds.CHECKIN_COMMENT));
+			assertTrue(propDefs.containsKey(PropertyIds.CONTENT_STREAM_LENGTH));
+			assertTrue(propDefs.containsKey(PropertyIds.CONTENT_STREAM_MIME_TYPE));
+			assertTrue(propDefs.containsKey(PropertyIds.CONTENT_STREAM_FILE_NAME));
+			assertTrue(propDefs.containsKey(PropertyIds.CONTENT_STREAM_ID));
+			assertTrue(propDefs.containsKey(PropertyIds.CHANGE_TOKEN));
+		} else if (baseTypeId.equals(BaseTypeId.CMIS_FOLDER.value())) {
+			assertTrue(propDefs.containsKey(PropertyIds.PARENT_ID));
+			assertTrue(propDefs.containsKey(PropertyIds.ALLOWED_CHILD_OBJECT_TYPE_IDS));
+			assertTrue(propDefs.containsKey(PropertyIds.PATH));
+		} else if (baseTypeId.equals(BaseTypeId.CMIS_POLICY.value())) {
+			assertTrue(propDefs.containsKey(PropertyIds.POLICY_TEXT));
+		} else if (baseTypeId.equals(BaseTypeId.CMIS_RELATIONSHIP.value())) {
+			assertTrue(propDefs.containsKey(PropertyIds.SOURCE_ID));
+			assertTrue(propDefs.containsKey(PropertyIds.TARGET_ID));
+		} else
+			fail("Unknown base type id in type definition");
+	}
+
+	private int getRecursiveSize(List<TypeDefinitionContainer> types) {
+		if (null == types)
+			return 0;
+
+		int size = types.size();
+		for (TypeDefinitionContainer type : types)
+			size += getRecursiveSize(type.getChildren());
+
+		return size;
+	}
+
+	public static class RepositoryTestTypeSystemCreator implements TypeCreator {
+
+		public static final String COMPLEX_TYPE = "ComplexType";
+		public static final String TOPLEVEL_TYPE = "DocumentTopLevel";
+		public static final String LEVEL1_TYPE = "DocumentLevel1";;
+		public static final String LEVEL2_TYPE = "DocumentLevel2";
+
+		static public List<TypeDefinition> singletonTypes = buildTypesList();
+
+		public List<TypeDefinition> createTypesList() {
+			return singletonTypes;
+		}
+
+		private static List<TypeDefinition> buildTypesList() {
+			List<TypeDefinition> typesList = new LinkedList<TypeDefinition>();
+
+			InMemoryDocumentTypeDefinition cmisType1 = new InMemoryDocumentTypeDefinition("MyDocType1",
+					"My Type 1 Level 1", InMemoryDocumentTypeDefinition.getRootDocumentType());
+			typesList.add(cmisType1);
+
+			InMemoryDocumentTypeDefinition cmisType2 = new InMemoryDocumentTypeDefinition("MyDocType2",
+					"My Type 2 Level 1", InMemoryDocumentTypeDefinition.getRootDocumentType());
+			typesList.add(cmisType2);
+
+			InMemoryDocumentTypeDefinition cmisType11 = new InMemoryDocumentTypeDefinition("MyDocType1.1",
+					"My Type 3 Level 2", cmisType1);
+			typesList.add(cmisType11);
+
+			InMemoryDocumentTypeDefinition cmisType111 = new InMemoryDocumentTypeDefinition("MyDocType1.1.1",
+					"My Type 4 Level 3", cmisType11);
+			typesList.add(cmisType111);
+
+			InMemoryDocumentTypeDefinition cmisType112 = new InMemoryDocumentTypeDefinition("MyDocType1.1.2",
+					"My Type 5 Level 3", cmisType11);
+			typesList.add(cmisType112);
+
+			InMemoryDocumentTypeDefinition cmisType12 = new InMemoryDocumentTypeDefinition("MyDocType1.2",
+					"My Type 6 Level 2", cmisType1);
+			typesList.add(cmisType12);
+
+			InMemoryDocumentTypeDefinition cmisType21 = new InMemoryDocumentTypeDefinition("MyDocType2.1",
+					"My Type 7 Level 2", cmisType2);
+			typesList.add(cmisType21);
+
+			InMemoryDocumentTypeDefinition cmisType22 = new InMemoryDocumentTypeDefinition("MyDocType2.2",
+					"My Type 8 Level 2", cmisType2);
+			typesList.add(cmisType22);
+			InMemoryDocumentTypeDefinition cmisType23 = new InMemoryDocumentTypeDefinition("MyDocType2.3",
+					"My Type 9 Level 2", cmisType2);
+			typesList.add(cmisType23);
+			InMemoryDocumentTypeDefinition cmisType24 = new InMemoryDocumentTypeDefinition("MyDocType2.4",
+					"My Type 10 Level 2", cmisType2);
+			typesList.add(cmisType24);
+			InMemoryDocumentTypeDefinition cmisType25 = new InMemoryDocumentTypeDefinition("MyDocType2.5",
+					"My Type 11 Level 2", cmisType2);
+			typesList.add(cmisType25);
+
+			InMemoryDocumentTypeDefinition cmisType26 = new InMemoryDocumentTypeDefinition("MyDocType2.6",
+					"My Type 12 Level 2", cmisType2);
+			typesList.add(cmisType26);
+			InMemoryDocumentTypeDefinition cmisType27 = new InMemoryDocumentTypeDefinition("MyDocType2.7",
+					"My Type 13 Level 2", cmisType2);
+			typesList.add(cmisType27);
+			InMemoryDocumentTypeDefinition cmisType28 = new InMemoryDocumentTypeDefinition("MyDocType2.8",
+					"My Type 14 Level 2", cmisType2);
+			typesList.add(cmisType28);
+			InMemoryDocumentTypeDefinition cmisType29 = new InMemoryDocumentTypeDefinition("MyDocType2.9",
+					"My Type 15 Level 2", cmisType2);
+			typesList.add(cmisType29);
+
+			// create a complex type with properties
+			InMemoryDocumentTypeDefinition cmisComplexType = new InMemoryDocumentTypeDefinition(COMPLEX_TYPE,
+					"Complex type with properties, Level 1", InMemoryDocumentTypeDefinition.getRootDocumentType());
+
+			// create a boolean property definition
+
+			Map<String, PropertyDefinition<?>> propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+
+			PropertyDefinition<Boolean> prop = PropertyCreationHelper.createBooleanDefinition("BooleanProp",
+					"Sample Boolean Property");
+			propertyDefinitions.put(prop.getId(), prop);
+
+			prop = PropertyCreationHelper.createBooleanMultiDefinition("BooleanPropMV",
+					"Sample Boolean multi-value Property");
+			propertyDefinitions.put(prop.getId(), prop);
+
+			PropertyDateTimeDefinitionImpl prop2 = PropertyCreationHelper.createDateTimeDefinition("DateTimeProp",
+					"Sample DateTime Property");
+			propertyDefinitions.put(prop2.getId(), prop2);
+
+			prop2 = PropertyCreationHelper.createDateTimeMultiDefinition("DateTimePropMV",
+					"Sample DateTime multi-value Property");
+			propertyDefinitions.put(prop2.getId(), prop2);
+
+			PropertyDecimalDefinitionImpl prop3 = PropertyCreationHelper.createDecimalDefinition("DecimalProp",
+					"Sample Decimal Property");
+			propertyDefinitions.put(prop3.getId(), prop3);
+
+			prop3 = PropertyCreationHelper.createDecimalDefinition("DecimalPropMV",
+					"Sample Decimal multi-value Property");
+			propertyDefinitions.put(prop3.getId(), prop3);
+
+			PropertyHtmlDefinitionImpl prop4 = PropertyCreationHelper.createHtmlDefinition("HtmlProp",
+					"Sample Html Property");
+			propertyDefinitions.put(prop4.getId(), prop4);
+
+			prop4 = PropertyCreationHelper.createHtmlDefinition("HtmlPropMV", "Sample Html multi-value Property");
+			propertyDefinitions.put(prop4.getId(), prop4);
+
+			PropertyIdDefinitionImpl prop5 = PropertyCreationHelper.createIdDefinition("IdProp", "Sample Id Property");
+			propertyDefinitions.put(prop5.getId(), prop5);
+
+			prop5 = PropertyCreationHelper.createIdDefinition("IdPropMV", "Sample Id Html multi-value Property");
+			propertyDefinitions.put(prop5.getId(), prop5);
+
+			PropertyIntegerDefinitionImpl prop6 = PropertyCreationHelper.createIntegerDefinition("IntProp",
+					"Sample Int Property");
+			propertyDefinitions.put(prop6.getId(), prop6);
+
+			prop6 = PropertyCreationHelper.createIntegerDefinition("IntPropMV", "Sample Int multi-value Property");
+			propertyDefinitions.put(prop6.getId(), prop6);
+
+			PropertyStringDefinitionImpl prop7 = PropertyCreationHelper.createStringDefinition("StringProp",
+					"Sample String Property");
+			propertyDefinitions.put(prop7.getId(), prop7);
+
+			PropertyUriDefinitionImpl prop8 = PropertyCreationHelper.createUriDefinition("UriProp",
+					"Sample Uri Property");
+			propertyDefinitions.put(prop8.getId(), prop8);
+
+			prop8 = PropertyCreationHelper.createUriDefinition("UriPropMV", "Sample Uri multi-value Property");
+			propertyDefinitions.put(prop8.getId(), prop8);
+
+			PropertyStringDefinitionImpl prop9 = PropertyCreationHelper.createStringDefinition("PickListProp",
+					"Sample Pick List Property");
+			List<Choice<String>> choiceList = new ArrayList<Choice<String>>();
+			ChoiceImpl<String> elem = new ChoiceImpl<String>();
+			elem.setValue(Collections.singletonList("red"));
+			choiceList.add(elem);
+			elem = new ChoiceImpl<String>();
+			elem.setValue(Collections.singletonList("green"));
+			choiceList.add(elem);
+			elem = new ChoiceImpl<String>();
+			elem.setValue(Collections.singletonList("blue"));
+			choiceList.add(elem);
+			elem = new ChoiceImpl<String>();
+			elem.setValue(Collections.singletonList("black"));
+			choiceList.add(elem);
+			prop9.setChoices(choiceList);
+			prop9.setDefaultValue(Collections.singletonList("blue"));
+
+			/*
+			 * try short form: / PropertyCreationHelper.addElemToPicklist(prop9,
+			 * "red"); PropertyCreationHelper.addElemToPicklist(prop9, "green");
+			 * PropertyCreationHelper.addElemToPicklist(prop9, "blue");
+			 * PropertyCreationHelper.addElemToPicklist(prop9, "black");
+			 * PropertyCreationHelper.setDefaultValue(prop9, "blue"); /
+			 */
+
+			cmisComplexType.addCustomPropertyDefinitions(propertyDefinitions);
+
+			// add type to types collection
+			typesList.add(cmisComplexType);
+
+			// create a type hierarchy with inherited properties
+			InMemoryDocumentTypeDefinition cmisDocTypeTopLevel = new InMemoryDocumentTypeDefinition(TOPLEVEL_TYPE,
+					"Document type with properties, Level 1", InMemoryDocumentTypeDefinition.getRootDocumentType());
+
+			InMemoryDocumentTypeDefinition cmisDocTypeLevel1 = new InMemoryDocumentTypeDefinition(LEVEL1_TYPE,
+					"Document type with inherited properties, Level 2", cmisDocTypeTopLevel);
+
+			InMemoryDocumentTypeDefinition cmisDocTypeLevel2 = new InMemoryDocumentTypeDefinition(LEVEL2_TYPE,
+					"Document type with inherited properties, Level 3", cmisDocTypeLevel1);
+
+			propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+			PropertyStringDefinitionImpl propTop = PropertyCreationHelper.createStringDefinition("StringPropTopLevel",
+					"Sample String Property");
+			propertyDefinitions.put(propTop.getId(), propTop);
+			cmisDocTypeTopLevel.addCustomPropertyDefinitions(propertyDefinitions);
+
+			propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+			PropertyStringDefinitionImpl propLevel1 = PropertyCreationHelper.createStringDefinition("StringPropLevel1",
+					"String Property Level 1");
+			propertyDefinitions.put(propLevel1.getId(), propLevel1);
+			cmisDocTypeLevel1.addCustomPropertyDefinitions(propertyDefinitions);
+
+			propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
+			PropertyStringDefinitionImpl propLevel2 = PropertyCreationHelper.createStringDefinition("StringPropLevel2",
+					"String Property Level 2");
+			propertyDefinitions.put(propLevel2.getId(), propLevel2);
+			cmisDocTypeLevel2.addCustomPropertyDefinitions(propertyDefinitions);
+
+			// add type to types collection
+			typesList.add(cmisDocTypeTopLevel);
+			typesList.add(cmisDocTypeLevel1);
+			typesList.add(cmisDocTypeLevel2);
+
+			return typesList;
+		}
+
+		public static List<TypeDefinition> getTypesList() {
+			return singletonTypes;
+		}
+
+		static public TypeDefinition getTypeById(String typeId) {
+			for (TypeDefinition typeDef : singletonTypes)
+				if (typeDef.getId().equals(typeId))
+					return typeDef;
+			return null;
+		}
+
+	}
 
-    public RepositoryInfo createRepositoryInfo() {
-      RepositoryCapabilitiesImpl caps = new RepositoryCapabilitiesImpl();
-      caps.setAllVersionsSearchable(false);
-      caps.setCapabilityAcl(CapabilityAcl.NONE);
-      caps.setCapabilityChanges(CapabilityChanges.NONE);
-      caps.setCapabilityContentStreamUpdates(CapabilityContentStreamUpdates.ANYTIME);
-      caps.setCapabilityJoin(CapabilityJoin.NONE);
-      caps.setCapabilityQuery(CapabilityQuery.NONE);
-      caps.setCapabilityRendition(CapabilityRenditions.NONE);
-      caps.setIsPwcSearchable(false);
-      caps.setIsPwcUpdatable(true);
-      caps.setSupportsGetDescendants(true);
-      caps.setSupportsGetFolderTree(true);
-      caps.setSupportsMultifiling(false);
-      caps.setSupportsUnfiling(true);
-      caps.setSupportsVersionSpecificFiling(false);
-      
-      RepositoryInfoImpl repositoryInfo = new RepositoryInfoImpl();     
-      repositoryInfo.setRepositoryId(REPOSITORY_ID);
-      repositoryInfo.setRepositoryName("InMemory Repository");
-      repositoryInfo.setRepositoryDescription("InMemory Test Repository");
-      repositoryInfo.setCmisVersionSupported("0.7");
-      repositoryInfo.setRepositoryCapabilities(caps);
-      repositoryInfo.setRootFolder("/");
-      repositoryInfo.setAclCapabilities(null);
-      repositoryInfo.setPrincipalAnonymous("anonymous");
-      repositoryInfo.setPrincipalAnyone("anyone");
-      repositoryInfo.setThinClientUri(null);
-      repositoryInfo.setChangesIncomplete(Boolean.TRUE);
-      repositoryInfo.setChangesOnType(null);
-      repositoryInfo.setLatestChangeLogToken(null);
-      repositoryInfo.setVendorName("OpenCMIS");
-      repositoryInfo.setProductName("OpenCMIS Client");
-      repositoryInfo.setProductVersion("0.1");
-      return repositoryInfo;
-    }    
-  }
-  
-  @Before
-  public void setUp() throws Exception {
-    super.setTypeCreatorClass(RepositoryTestTypeSystemCreator.class.getName());
-    super.setUp();
-  }
-
-  @After
-  public void tearDown() throws Exception {
-    super.tearDown();
-  }
-
-  @Test
-  public void testRepositoryInfo() throws Exception {
-    log.info("starting testRepositoryInfo() ...");
-    List<RepositoryInfo> repositories = fRepSvc.getRepositoryInfos(
-        null);
-    assertNotNull(repositories);
-    assertFalse(repositories.isEmpty());
-
-    log.info("geRepositoryInfo(), found " + repositories.size() + " repository/repositories).");
-
-    for (RepositoryInfo repository : repositories) {
-      RepositoryInfo repository2 = fRepSvc.getRepositoryInfo(
-          repository.getId(), null);
-      assertNotNull(repository2);
-      assertEquals(repository.getId(), repository2.getId());
-      log.info("found repository" + repository2.getId());
-    }
-
-    log.info("... testRepositoryInfo() finished.");
-  }
-
-  @Test
-  public void testTypeDefinition() throws Exception {
-    log.info("");
-    log.info("starting testTypeDefinition() ...");
-    String repositoryId = getRepositoryId();
-    String typeId = "MyDocType1";
-    TypeDefinition ref = RepositoryTestTypeSystemCreator.getTypeById(typeId);
-    TypeDefinition type = fRepSvc.getTypeDefinition(repositoryId,
-        typeId, null);
-    assertEquals(ref.getId(), type.getId());
-    assertEquals(ref.getDescription(), type.getDescription());
-    assertEquals(ref.getDisplayName(), type.getDisplayName());
-    assertEquals(ref.getLocalName(), type.getLocalName());
-    assertEquals(ref.getLocalNamespace(), type.getLocalNamespace());
-    containsAllBasePropertyDefinitions(type);
-    log.info("... testTypeDefinition() finished.");
-  }
-
-  @Test
-  public void testGetAllTypesUnlimitedDepth() {
-    log.info("");
-    log.info("starting testGetAllTypesUnlimitedDepth()...");
-    String repositoryId = getRepositoryId();
-
-    // get types
-    List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(
-        repositoryId, null/* all types */, BigInteger.valueOf(-1), Boolean.TRUE, null);
-    assertNotNull(types);
-    log.info("Repository " + repositoryId + " contains " + types.size() + " type(s).");
-    
-    
-    // check that we got all types
-    int expectedSize = RepositoryTestTypeSystemCreator.getTypesList().size()
-        + DocumentTypeCreationHelper.getDefaultTypes().size();
-    int totalSize = getRecursiveSize(types);
-
-    assertEquals(expectedSize, totalSize);
-    assertEquals(2, types.size());
-
-    for (TypeDefinitionContainer type : types) {
-      assertNotNull(type);
-      TypeDefinition typeDef = type.getTypeDefinition();
-      assertNotNull(typeDef);
-      assertNotNull(typeDef.getId());
-      assertNotNull(typeDef.getBaseTypeId());
-      log.info("Found type: " + typeDef.getId() + ", display name is: " + typeDef.getDisplayName());
-      log.info("  Base type is: " + typeDef.getBaseTypeId());
-      log.info("  Number of children types is: " + type.getChildren().size());
-      Map<String, PropertyDefinition<?>> propDefs = type.getTypeDefinition().getPropertyDefinitions();
-      log.info("  Number of properties is: " + (propDefs==null ? 0 : propDefs.size()));
-      containsAllBasePropertyDefinitions(typeDef);
-    }
-
-    log.info("... testGetAllTypesUnlimitedDepth() finished.");
-  }
-
-  @Test
-  public void testGetAllTypesLimitedDepth() {
-    log.info("");
-    log.info("starting testGetAllTypesLimitedDepth()...");
-    String repositoryId = getRepositoryId();
-
-    // get types
-    int depth = 1;
-    List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(
-        repositoryId, BaseTypeId.CMIS_DOCUMENT.value(), BigInteger.valueOf(depth), Boolean.TRUE, null);
-    assertNotNull(types);
-    log.info("Found in repository " + repositoryId + " " + types.size() + " type(s) with depth "
-        + depth + ".");
-
-    for (TypeDefinitionContainer type : types) {
-      TypeDefinition typeDef = type.getTypeDefinition();
-      log.info("Found type: " + typeDef.getId() + ", display name is: " + typeDef.getDisplayName());
-      log.info("  Base type is: " + typeDef.getBaseTypeId());
-      log.info("  Number of children types is: " + type.getChildren().size());
-      containsAllBasePropertyDefinitions(typeDef);
-    }
-
-    int totalSize = getRecursiveSize(types);
-    assertEquals(4, totalSize); // all RepositoryTestTypeSystemCreator types minus one in level two plus cmis.docment
-    assertFalse(containsTypeByIdRecursive(BaseTypeId.CMIS_DOCUMENT.value(), types));
-    assertFalse(containsTypeByIdRecursive(BaseTypeId.CMIS_FOLDER.value(), types));
-    
-    assertTrue(containsTypeByIdRecursive("MyDocType1", types));
-    assertTrue(containsTypeByIdRecursive("MyDocType2", types));
-
-    assertFalse(containsTypeByIdRecursive(RepositoryTestTypeSystemCreator.LEVEL2_TYPE, types));
-
-    for (TypeDefinitionContainer type : types) {
-      assertNotNull(type);
-      TypeDefinition typeDef = type.getTypeDefinition();
-      assertNotNull(typeDef);
-      assertNotNull(typeDef.getId());
-      assertNotNull(typeDef.getBaseTypeId());
-    }
-
-    log.info("... testGetAllTypesLimitedDepth() finished.");
-  }
-
-  @Test
-  public void testGetSpecificTypeLimitedDepth() {
-    log.info("");
-    log.info("starting testGetSpecificTypeLimitedDepth()...");
-    String repositoryId = getRepositoryId();
-
-    // get types
-    int depth = 2;
-    String typeId = "MyDocType1";
-    List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(
-        repositoryId, typeId, BigInteger.valueOf(depth), Boolean.TRUE, null);
-    assertNotNull(types);
-    log.info("Found in repository " + repositoryId + " for type " + typeId + ", " + types.size()
-        + " type(s) with depth " + depth + ".");
-
-    assertEquals(4, getRecursiveSize(types));
-    assertTrue(containsTypeByIdRecursive("MyDocType1.1", types));
-    assertTrue(containsTypeByIdRecursive("MyDocType1.2", types));
-    assertTrue(containsTypeByIdRecursive("MyDocType1.1.1", types));
-    assertTrue(containsTypeByIdRecursive("MyDocType1.1.2", types));
-    for (TypeDefinitionContainer type : types) {
-      assertNotNull(type);
-      TypeDefinition typeDef = type.getTypeDefinition();
-      assertNotNull(typeDef);
-      assertNotNull(typeDef.getId());
-      assertNotNull(typeDef.getBaseTypeId());
-      log.info("Found type: " + typeDef.getId() + ", display name is: " + typeDef.getDisplayName());
-      log.info("  Base type is: " + typeDef.getBaseTypeId());
-      log.info("  Number of children types is: " + type.getChildren().size());
-      containsAllBasePropertyDefinitions(typeDef);
-    }
-
-    log.info("... testGetSpecificTypeLimitedDepth() finished.");
-  }
-  
-  @Test
-  public void testGetTypesWithoutProperties() {
-    log.info("");
-    log.info("starting testGetTypesWithoutProperties()...");
-    String repositoryId = getRepositoryId();
-    String typeId = BaseTypeId.CMIS_DOCUMENT.value();
-
-    // get types
-    List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(
-        repositoryId, typeId, BigInteger.valueOf(-1), false, null);
-    assertNotNull(types);
-    log.info("Repository " + repositoryId + " contains " + types.size() + " type(s).");
-
-    TypeDefinitionContainer typeWithProps = null;
-    for (TypeDefinitionContainer type : types) {
-      if (type.getTypeDefinition().getId().equals(RepositoryTestTypeSystemCreator.COMPLEX_TYPE)) {
-        typeWithProps = type;
-        break;
-      }
-    }
-    assertNotNull(typeWithProps);
-    TypeDefinition typeDef = typeWithProps.getTypeDefinition();
-    Map<String, PropertyDefinition<?>> propDefs = typeDef.getPropertyDefinitions();
-    log.info("Found type: " + typeDef.getId() + ", display name is: " + typeDef.getDisplayName());
-    log.info("  Base type is: " + typeDef.getBaseTypeId());
-    log.info("  Number of properties is: " + (propDefs==null ? 0 : propDefs.size()));
-    assertTrue(propDefs==null || propDefs.size()==0);
-    log.info("... testGetTypesWithoutProperties() finished.");
-  }
-
-  @Test
-  public void testGetTypeChildren() {
-    log.info("");
-    log.info("starting testGetTypeChildren()...");
-    String repositoryId = getRepositoryId();
-    String typeId = "MyDocType2";
-
-    // get all children
-    BigInteger maxItems = BigInteger.valueOf(1000);
-    BigInteger skipCount = BigInteger.valueOf(0);
-    TypeDefinitionList children = fRepSvc.getTypeChildren(repositoryId,
-        typeId, true, maxItems, skipCount, null);
-
-    for (TypeDefinition type : children.getList()) {
-      log.info("Found type: " + type.getId() + ", display name is: " + type.getDisplayName());
-      containsAllBasePropertyDefinitions(type);
-    }
-    assertEquals(9, children.getList().size());
-    assertEquals(9, children.getNumItems().intValue());
-    assertFalse(children.hasMoreItems());
-
-    // get a chunk
-    maxItems = BigInteger.valueOf(5);
-    skipCount = BigInteger.valueOf(3);
-    children = fRepSvc.getTypeChildren(repositoryId, typeId, true,
-        maxItems, skipCount, null);
-
-    for (TypeDefinition type : children.getList()) {
-      log.info("Found type: " + type.getId() + ", display name is: " + type.getDisplayName());
-      containsAllBasePropertyDefinitions(type);
-    }
-    assertEquals(5, children.getList().size());
-    assertEquals(9, children.getNumItems().intValue());
-    assertTrue(children.hasMoreItems());
-
-    log.info("... testGetTypeChildren() finished.");
-  }
-
-  @Test
-  public void testGetWrongParameters() {
-    log.info("");
-    log.info("starting testGetWrongParameters()...");
-    String repositoryId = getRepositoryId();
-    String wrongRepositoryId = "NonExistantRepository";
-
-    // get types
-    int depth = -1;
-    String wrongTypeId = "UnknownType";
-
-    try {
-      RepositoryInfo repInf = fRepSvc.getRepositoryInfo(
-          wrongRepositoryId, null);
-      log.debug("getRepositoryInfo(): " + repInf);
-      fail("getRepositoryInfo() with illegal repository id should throw InvalidArgumentException.");
-    }
-    catch (CmisInvalidArgumentException e) {
-      log.info("getRepositoryInfo() with depth==0 raised expected exception: " + e);
-    }
-
-    try {
-      List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(
-          repositoryId, "CMISDocument", BigInteger.valueOf(0), Boolean.TRUE, null);
-      log.debug("getTypeDescendants(): " + types);
-      fail("getTypeDescendants() with depth 0 should throw InvalidArgumentException.");
-    }
-    catch (CmisInvalidArgumentException e) {
-      log.info("getTypeDescendants() with depth==0 raised expected exception: " + e);
-    }
-
-    try {
-      List<TypeDefinitionContainer> types = fRepSvc.getTypeDescendants(
-          repositoryId, wrongTypeId, BigInteger.valueOf(depth), Boolean.TRUE, null);
-      log.debug("getTypeDescendants(): " + types);
-      fail("getTypeDescendants() with unknown type should throw exception.");
-    }
-    catch (CmisInvalidArgumentException e) {
-      log.info("getTypeDescendants() with unknown type raised expected exception: " + e);
-    }
-
-    try {
-      TypeDefinition type = fRepSvc.getTypeDefinition(
-          wrongRepositoryId, "CMISDocument", null);
-      log.debug("getTypeDefinition(): " + type);
-      fail("getTypeDefinition() with unknown repository id should throw exception.");
-    }
-    catch (CmisInvalidArgumentException e) {
-      log.info("getTypeDefinition() with unknown repository id raised expected exception: " + e);
-    }
-
-    try {
-      TypeDefinition type = fRepSvc.getTypeDefinition(repositoryId,
-          wrongTypeId, null);
-      log.debug("getTypeDefinition(): " + type);
-      fail("getTypeDefinition() with unknown type should throw exception.");
-    }
-    catch (CmisObjectNotFoundException e) {
-      log.info("getTypeDefinition() with unknown type raised expected exception: " + e);
-    }
-
-    try {
-      TypeDefinitionList types = fRepSvc.getTypeChildren(
-          wrongRepositoryId, "CMISDocument", Boolean.TRUE, BigInteger.valueOf(100),
-          BigInteger.ZERO, null);
-      log.debug("getTypeChildren(): " + types);
-      fail("getTypeDescendants() with unknown type should throw InvalidArgumentException.");
-    }
-    catch (CmisInvalidArgumentException e) {
-      log.info("getTypeDescendants() with unknown repository id raised expected exception: " + e);
-    }
-
-    try {
-      TypeDefinitionList types = fRepSvc.getTypeChildren(repositoryId,
-          wrongTypeId, Boolean.TRUE, BigInteger.valueOf(100), BigInteger.ZERO, null);
-      log.debug("getTypeChildren(): " + types);
-      fail("getTypeDescendants() with unknown type should throw exception.");
-    }
-    catch (CmisInvalidArgumentException e) {
-      log.info("getTypeDescendants() with unknown type raised expected exception: " + e);
-    }
-
-    log.info("... testGetUnknownType() testGetWrongParameters.");
-
-  }
-
-  @Test
-  public void testInheritedProperties() {
-    log.info("");
-    log.info("starting testInheritedProperties()...");
-    String repositoryId = getRepositoryId();
-    String typeId = RepositoryTestTypeSystemCreator.TOPLEVEL_TYPE;
-
-    // get top level type
-    TypeDefinition typeContainer = fRepSvc.getTypeDefinition(
-        repositoryId, typeId, null);
-    assertNotNull(typeContainer);
-    Map<String, PropertyDefinition<?>> propDefMap = typeContainer.getPropertyDefinitions();
-    assertTrue(propDefMap.containsKey("StringPropTopLevel"));
-    assertFalse(propDefMap.get("StringPropTopLevel").isInherited());
-    assertFalse(propDefMap.containsKey("StringPropLevel1"));
-    assertFalse(propDefMap.containsKey("StringPropLevel2"));
-    containsAllBasePropertyDefinitions(typeContainer);
-    
-    // get level 1 type
-    typeId = RepositoryTestTypeSystemCreator.LEVEL1_TYPE;
-    typeContainer = fRepSvc.getTypeDefinition(
-        repositoryId, typeId, null);
-    assertNotNull(typeContainer);
-    propDefMap = typeContainer.getPropertyDefinitions();
-    assertTrue(propDefMap.containsKey("StringPropTopLevel"));
-    assertTrue(propDefMap.get("StringPropTopLevel").isInherited());
-    assertTrue(propDefMap.containsKey("StringPropLevel1"));
-    assertFalse(propDefMap.get("StringPropLevel1").isInherited());
-    assertFalse(propDefMap.containsKey("StringPropLevel2"));
-    containsAllBasePropertyDefinitions(typeContainer);
-    
-    // get level 2 type
-    typeId = RepositoryTestTypeSystemCreator.LEVEL2_TYPE;
-    typeContainer = fRepSvc.getTypeDefinition(
-        repositoryId, typeId, null);
-    assertNotNull(typeContainer);
-    propDefMap = typeContainer.getPropertyDefinitions();
-    assertTrue(propDefMap.containsKey("StringPropTopLevel"));
-    assertTrue(propDefMap.get("StringPropTopLevel").isInherited());
-    assertTrue(propDefMap.containsKey("StringPropLevel1"));
-    assertTrue(propDefMap.get("StringPropLevel1").isInherited());
-    assertTrue(propDefMap.containsKey("StringPropLevel2"));
-    assertFalse(propDefMap.get("StringPropLevel2").isInherited());
-    containsAllBasePropertyDefinitions(typeContainer);
-    
-    log.info("... testInheritedProperties() finished.");
-  }
-
-  private String getRepositoryId() {
-    List<RepositoryInfo> repositories = fRepSvc.getRepositoryInfos(
-        null);
-    RepositoryInfo repository = repositories.get(0);
-    assertNotNull(repository);
-    return repository.getId();
-  }
-
-  private boolean containsTypeById(String typeId, List<TypeDefinitionContainer> types) {
-    for (TypeDefinitionContainer type : types) {
-      if (type.getTypeDefinition().getId().equals(typeId))
-        return true;
-    }
-    return false;
-  }
-  
-  private boolean containsTypeByIdRecursive(String typeId, List<TypeDefinitionContainer> types) {
-    for (TypeDefinitionContainer type : types) {
-      if (containsTypeByIdRecursive(typeId, type))
-        return true;
-    }
-    return false;
-  }
-  
-  private boolean containsTypeByIdRecursive(String typeId, TypeDefinitionContainer typeContainer) {
-    if (typeId.equals(typeContainer.getTypeDefinition().getId()))
-      return true;
-    
-    for (TypeDefinitionContainer type : typeContainer.getChildren()) {
-      if (containsTypeByIdRecursive(typeId, type))
-        return true;      
-    }
-    return false;
-  }
-
-  private void containsAllBasePropertyDefinitions(TypeDefinition typeDef) {
-    Map<String, PropertyDefinition<?>> propDefs = typeDef.getPropertyDefinitions();
-    String baseTypeId = typeDef.getBaseTypeId().value();
-    
-    assertTrue(propDefs.containsKey(PropertyIds.NAME));
-    assertTrue(propDefs.containsKey(PropertyIds.OBJECT_ID));
-    assertTrue(propDefs.containsKey(PropertyIds.OBJECT_TYPE_ID));
-    assertTrue(propDefs.containsKey(PropertyIds.BASE_TYPE_ID));
-    assertTrue(propDefs.containsKey(PropertyIds.CREATED_BY));
-    assertTrue(propDefs.containsKey(PropertyIds.CREATION_DATE));
-    assertTrue(propDefs.containsKey(PropertyIds.LAST_MODIFIED_BY));
-    assertTrue(propDefs.containsKey(PropertyIds.LAST_MODIFICATION_DATE));
-    assertTrue(propDefs.containsKey(PropertyIds.CHANGE_TOKEN));
-
-    if (baseTypeId.equals(BaseTypeId.CMIS_DOCUMENT.value())) {
-      assertTrue(propDefs.containsKey(PropertyIds.IS_IMMUTABLE));
-      assertTrue(propDefs.containsKey(PropertyIds.IS_LATEST_VERSION));
-      assertTrue(propDefs.containsKey(PropertyIds.IS_MAJOR_VERSION));
-      assertTrue(propDefs.containsKey(PropertyIds.IS_LATEST_MAJOR_VERSION));
-      assertTrue(propDefs.containsKey(PropertyIds.VERSION_LABEL));
-      assertTrue(propDefs.containsKey(PropertyIds.VERSION_SERIES_ID));
-      assertTrue(propDefs.containsKey(PropertyIds.IS_VERSION_SERIES_CHECKED_OUT));
-      assertTrue(propDefs.containsKey(PropertyIds.VERSION_SERIES_CHECKED_OUT_BY));
-      assertTrue(propDefs.containsKey(PropertyIds.VERSION_SERIES_CHECKED_OUT_ID));
-      assertTrue(propDefs.containsKey(PropertyIds.CHECKIN_COMMENT));
-      assertTrue(propDefs.containsKey(PropertyIds.CONTENT_STREAM_LENGTH));
-      assertTrue(propDefs.containsKey(PropertyIds.CONTENT_STREAM_MIME_TYPE));
-      assertTrue(propDefs.containsKey(PropertyIds.CONTENT_STREAM_FILE_NAME));
-      assertTrue(propDefs.containsKey(PropertyIds.CONTENT_STREAM_ID));
-      assertTrue(propDefs.containsKey(PropertyIds.CHANGE_TOKEN));      
-    } else if (baseTypeId.equals(BaseTypeId.CMIS_FOLDER.value())) {
-      assertTrue(propDefs.containsKey(PropertyIds.PARENT_ID));      
-      assertTrue(propDefs.containsKey(PropertyIds.ALLOWED_CHILD_OBJECT_TYPE_IDS));      
-      assertTrue(propDefs.containsKey(PropertyIds.PATH));            
-    } else if (baseTypeId.equals(BaseTypeId.CMIS_POLICY.value())) {
-      assertTrue(propDefs.containsKey(PropertyIds.POLICY_TEXT));            
-    } else if (baseTypeId.equals(BaseTypeId.CMIS_RELATIONSHIP.value())) {
-      assertTrue(propDefs.containsKey(PropertyIds.SOURCE_ID));      
-      assertTrue(propDefs.containsKey(PropertyIds.TARGET_ID));            
-    } else
-      fail("Unknown base type id in type definition");
-  }
-  
-  private int getRecursiveSize(List<TypeDefinitionContainer> types) {
-    if (null == types)
-      return 0;
-    
-    int size = types.size();
-    for (TypeDefinitionContainer type: types)
-      size += getRecursiveSize(type.getChildren());
-    
-    return size;
-  }
-  
-  public static class RepositoryTestTypeSystemCreator implements TypeCreator {
-
-    public static final String COMPLEX_TYPE = "ComplexType";
-    public static final String TOPLEVEL_TYPE = "DocumentTopLevel";
-    public static final String LEVEL1_TYPE = "DocumentLevel1";;
-    public static final String LEVEL2_TYPE = "DocumentLevel2";
-    
-    static public List<TypeDefinition> singletonTypes = buildTypesList();
-    
-    public List<TypeDefinition> createTypesList() {
-      return singletonTypes;
-    }
-
-    private static List<TypeDefinition> buildTypesList() {
-      List<TypeDefinition> typesList = new LinkedList<TypeDefinition>();
-
-      InMemoryDocumentTypeDefinition cmisType1 = new InMemoryDocumentTypeDefinition("MyDocType1",
-          "My Type 1 Level 1", InMemoryDocumentTypeDefinition.getRootDocumentType());
-      typesList.add(cmisType1);
-      
-
-      InMemoryDocumentTypeDefinition cmisType2 = new InMemoryDocumentTypeDefinition("MyDocType2",
-          "My Type 2 Level 1", InMemoryDocumentTypeDefinition.getRootDocumentType());
-      typesList.add(cmisType2);
-
-      InMemoryDocumentTypeDefinition cmisType11 = new InMemoryDocumentTypeDefinition("MyDocType1.1",
-          "My Type 3 Level 2", cmisType1);
-      typesList.add(cmisType11);
-
-      InMemoryDocumentTypeDefinition cmisType111 = new InMemoryDocumentTypeDefinition("MyDocType1.1.1",
-          "My Type 4 Level 3", cmisType11);
-      typesList.add(cmisType111);
-
-      InMemoryDocumentTypeDefinition cmisType112 = new InMemoryDocumentTypeDefinition("MyDocType1.1.2",
-          "My Type 5 Level 3", cmisType11);
-      typesList.add(cmisType112);
-
-      InMemoryDocumentTypeDefinition cmisType12 = new InMemoryDocumentTypeDefinition("MyDocType1.2",
-          "My Type 6 Level 2", cmisType1);
-      typesList.add(cmisType12);
-
-      InMemoryDocumentTypeDefinition cmisType21 = new InMemoryDocumentTypeDefinition("MyDocType2.1",
-          "My Type 7 Level 2", cmisType2);
-      typesList.add(cmisType21);
-
-      InMemoryDocumentTypeDefinition cmisType22 = new InMemoryDocumentTypeDefinition("MyDocType2.2",
-          "My Type 8 Level 2", cmisType2);
-      typesList.add(cmisType22);
-      InMemoryDocumentTypeDefinition cmisType23 = new InMemoryDocumentTypeDefinition("MyDocType2.3",
-          "My Type 9 Level 2", cmisType2);
-      typesList.add(cmisType23);
-      InMemoryDocumentTypeDefinition cmisType24 = new InMemoryDocumentTypeDefinition("MyDocType2.4",
-          "My Type 10 Level 2", cmisType2);
-      typesList.add(cmisType24);
-      InMemoryDocumentTypeDefinition cmisType25 = new InMemoryDocumentTypeDefinition("MyDocType2.5",
-          "My Type 11 Level 2", cmisType2);
-      typesList.add(cmisType25);
-
-      InMemoryDocumentTypeDefinition cmisType26 = new InMemoryDocumentTypeDefinition("MyDocType2.6",
-          "My Type 12 Level 2", cmisType2);
-      typesList.add(cmisType26);
-      InMemoryDocumentTypeDefinition cmisType27 = new InMemoryDocumentTypeDefinition("MyDocType2.7",
-          "My Type 13 Level 2", cmisType2);
-      typesList.add(cmisType27);
-      InMemoryDocumentTypeDefinition cmisType28 = new InMemoryDocumentTypeDefinition("MyDocType2.8",
-          "My Type 14 Level 2", cmisType2);
-      typesList.add(cmisType28);
-      InMemoryDocumentTypeDefinition cmisType29 = new InMemoryDocumentTypeDefinition("MyDocType2.9",
-          "My Type 15 Level 2", cmisType2);
-      typesList.add(cmisType29);
-
-      // create a complex type with properties
-      InMemoryDocumentTypeDefinition cmisComplexType = new InMemoryDocumentTypeDefinition(COMPLEX_TYPE,
-          "Complex type with properties, Level 1", InMemoryDocumentTypeDefinition.getRootDocumentType());
-      
-      // create a boolean property definition
-      
-      Map<String, PropertyDefinition<?>> propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
-      
-      PropertyDefinition<Boolean> prop = PropertyCreationHelper.createBooleanDefinition("BooleanProp", "Sample Boolean Property");
-      propertyDefinitions.put(prop.getId(), prop);
-      
-      prop = PropertyCreationHelper.createBooleanMultiDefinition("BooleanPropMV", "Sample Boolean multi-value Property");
-      propertyDefinitions.put(prop.getId(), prop);
-
-      PropertyDateTimeDefinitionImpl prop2 = PropertyCreationHelper.createDateTimeDefinition("DateTimeProp", "Sample DateTime Property");
-      propertyDefinitions.put(prop2.getId(), prop2);
-      
-      prop2 = PropertyCreationHelper.createDateTimeMultiDefinition("DateTimePropMV", "Sample DateTime multi-value Property");
-      propertyDefinitions.put(prop2.getId(), prop2);
-
-      PropertyDecimalDefinitionImpl prop3 = PropertyCreationHelper.createDecimalDefinition("DecimalProp", "Sample Decimal Property");
-      propertyDefinitions.put(prop3.getId(), prop3);
-      
-      prop3 = PropertyCreationHelper.createDecimalDefinition("DecimalPropMV", "Sample Decimal multi-value Property");
-      propertyDefinitions.put(prop3.getId(), prop3);
-
-      PropertyHtmlDefinitionImpl prop4 = PropertyCreationHelper.createHtmlDefinition("HtmlProp", "Sample Html Property");
-      propertyDefinitions.put(prop4.getId(), prop4);
-      
-      prop4 = PropertyCreationHelper.createHtmlDefinition("HtmlPropMV", "Sample Html multi-value Property");
-      propertyDefinitions.put(prop4.getId(), prop4);
-
-      PropertyIdDefinitionImpl prop5 = PropertyCreationHelper.createIdDefinition("IdProp", "Sample Id Property");
-      propertyDefinitions.put(prop5.getId(), prop5);
-      
-      prop5 = PropertyCreationHelper.createIdDefinition("IdPropMV", "Sample Id Html multi-value Property");
-      propertyDefinitions.put(prop5.getId(), prop5);
-
-      PropertyIntegerDefinitionImpl prop6 = PropertyCreationHelper.createIntegerDefinition("IntProp", "Sample Int Property");
-      propertyDefinitions.put(prop6.getId(), prop6);
-      
-      prop6 = PropertyCreationHelper.createIntegerDefinition("IntPropMV", "Sample Int multi-value Property");
-      propertyDefinitions.put(prop6.getId(), prop6);
-
-      PropertyStringDefinitionImpl prop7 = PropertyCreationHelper.createStringDefinition("StringProp", "Sample String Property");
-      propertyDefinitions.put(prop7.getId(), prop7);
-      
-      PropertyUriDefinitionImpl prop8 = PropertyCreationHelper.createUriDefinition("UriProp", "Sample Uri Property");
-      propertyDefinitions.put(prop8.getId(), prop8);
-      
-      prop8 = PropertyCreationHelper.createUriDefinition("UriPropMV", "Sample Uri multi-value Property");
-      propertyDefinitions.put(prop8.getId(), prop8);
-
-      PropertyStringDefinitionImpl prop9 = PropertyCreationHelper.createStringDefinition("PickListProp", "Sample Pick List Property");
-      List<Choice<String>> choiceList = new ArrayList<Choice<String>>();
-      ChoiceImpl<String> elem = new ChoiceImpl<String>();
-      elem.setValue(Collections.singletonList("red"));
-      choiceList.add(elem);
-      elem = new ChoiceImpl<String>();
-      elem.setValue(Collections.singletonList("green"));
-      choiceList.add(elem);
-      elem = new ChoiceImpl<String>();
-      elem.setValue(Collections.singletonList("blue"));
-      choiceList.add(elem);
-      elem = new ChoiceImpl<String>();
-      elem.setValue(Collections.singletonList("black"));
-      choiceList.add(elem);   
-      prop9.setChoices(choiceList);
-      prop9.setDefaultValue(Collections.singletonList("blue"));
-      
-      /* try short form: * /
-      PropertyCreationHelper.addElemToPicklist(prop9, "red");    
-      PropertyCreationHelper.addElemToPicklist(prop9, "green");    
-      PropertyCreationHelper.addElemToPicklist(prop9, "blue");    
-      PropertyCreationHelper.addElemToPicklist(prop9, "black");
-      PropertyCreationHelper.setDefaultValue(prop9, "blue");    
-      /* */
-      
-      cmisComplexType.addCustomPropertyDefinitions(propertyDefinitions);    
-      
-      // add type to types collection
-      typesList.add(cmisComplexType);
-
-      // create a type hierarchy with inherited properties
-      InMemoryDocumentTypeDefinition cmisDocTypeTopLevel = new InMemoryDocumentTypeDefinition(TOPLEVEL_TYPE,
-          "Document type with properties, Level 1", InMemoryDocumentTypeDefinition.getRootDocumentType());
-
-      InMemoryDocumentTypeDefinition cmisDocTypeLevel1 = new InMemoryDocumentTypeDefinition(LEVEL1_TYPE,
-          "Document type with inherited properties, Level 2", cmisDocTypeTopLevel);
-      
-      InMemoryDocumentTypeDefinition cmisDocTypeLevel2 = new InMemoryDocumentTypeDefinition(LEVEL2_TYPE,
-          "Document type with inherited properties, Level 3", cmisDocTypeLevel1);
-      
-      propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
-      PropertyStringDefinitionImpl propTop = PropertyCreationHelper.createStringDefinition("StringPropTopLevel", "Sample String Property");
-      propertyDefinitions.put(propTop.getId(), propTop);
-      cmisDocTypeTopLevel.addCustomPropertyDefinitions(propertyDefinitions);    
-      
-      propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
-      PropertyStringDefinitionImpl propLevel1 = PropertyCreationHelper.createStringDefinition("StringPropLevel1", "String Property Level 1");
-      propertyDefinitions.put(propLevel1.getId(), propLevel1);
-      cmisDocTypeLevel1.addCustomPropertyDefinitions(propertyDefinitions);    
-
-      propertyDefinitions = new HashMap<String, PropertyDefinition<?>>();
-      PropertyStringDefinitionImpl propLevel2 = PropertyCreationHelper.createStringDefinition("StringPropLevel2", "String Property Level 2");
-      propertyDefinitions.put(propLevel2.getId(), propLevel2);
-      cmisDocTypeLevel2.addCustomPropertyDefinitions(propertyDefinitions);    
-
-      // add type to types collection
-      typesList.add(cmisDocTypeTopLevel);
-      typesList.add(cmisDocTypeLevel1);
-      typesList.add(cmisDocTypeLevel2);
-      
-      return typesList;
-    }
-    
-    public static List<TypeDefinition> getTypesList() {
-      return singletonTypes;
-    }
-    
-    static public TypeDefinition getTypeById(String typeId) {
-      for (TypeDefinition typeDef : singletonTypes)
-        if (typeDef.getId().equals(typeId))
-          return typeDef;
-      return null;
-    }
-    
-  }
-  
 }